Можем ли мы протестировать бота в собственном клиенте без лазурного или эмулятора бота?

Я новичок в этом. Я проверил уже заданные вопросы и не нашел ответа на свой сценарий.

Запрос: Я пытаюсь создать бота локально, и мне это удалось с помощью документации. Я могу проверить это в эмуляторе бота. Теперь я хочу создать своего собственного клиента в wpf, все образцы, которые я нашел в Интернете, имеют секрет прямой связи от лазурного. Но эмулятор работает без Интернета, поэтому я подумал, что они должны делать это без секрета.

Поскольку я разработчик приложений WPF, я не мог понять исходный код эмулятора или сделать его работоспособным.

Может ли кто-нибудь сказать мне или указать, где я могу проверить, как запустить бот-клиент локально без секретного секрета azure direcltline?

Бот

[BotAuthentication]
public class MessagesController : ApiController
{
    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.Type == ActivityTypes.Message)
        {
            await Conversation.SendAsync(activity, () => new DirectLineBotDialog());
        }
        else
        {
            await HandleSystemMessage(activity);
        }

        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

    private async Task HandleSystemMessage(Activity message)
    {
        if (message.Type == ActivityTypes.DeleteUserData)
        {
            // Implement user deletion here
            // If we handle user deletion, return a real message
        }
        else if (message.Type == ActivityTypes.ConversationUpdate)
        {
            // Handle conversation state changes, like members being added and removed
            // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
            // Not available in all channels

            if (message.MembersAdded.Any(o => o.Id == message.Recipient.Id))
            {
                ConnectorClient client = new ConnectorClient(new Uri(message.ServiceUrl));

                var reply = message.CreateReply();

                reply.Text = "Welcome to the Bot to showcase the DirectLine API. Send 'Show me a hero card' or 'Send me a BotFramework image' to see how the DirectLine client supports custom channel data. Any other message will be echoed.";

                await client.Conversations.ReplyToActivityAsync(reply);
            }
        }
        else if (message.Type == ActivityTypes.ContactRelationUpdate)
        {
            // Handle add/remove from contact lists
            // Activity.From + Activity.Action represent what happened
        }
        else if (message.Type == ActivityTypes.Typing)
        {
            // Handle knowing tha the user is typing
        }
        else if (message.Type == ActivityTypes.Ping)
        {
        }

    }
}

Клиент:

 class Program
{
    private static string directLineSecret = ConfigurationManager.AppSettings["DirectLineSecret"];
    private static string botId = ConfigurationManager.AppSettings["BotId"];
    private static string fromUser = "DirectLineSampleClientUser";

    static void Main(string[] args)
    {
        StartBotConversation().Wait();
    }


    private static async Task StartBotConversation()
    {
        DirectLineClient client = new DirectLineClient(directLineSecret);
        var conversation = await client.Conversations.StartConversationAsync();

        new System.Threading.Thread(async () => await ReadBotMessagesAsync(client, conversation.ConversationId)).Start();

        Console.Write("Command> ");

        while (true)
        {
            string input = Console.ReadLine().Trim();

            if (input.ToLower() == "exit")
            {
                break;
            }
            else
            {
                if (input.Length > 0)
                {
                    Activity userMessage = new Activity
                    {
                        From = new ChannelAccount(fromUser),
                        Text = input,
                        Type = ActivityTypes.Message
                    };

                    await client.Conversations.PostActivityAsync(conversation.ConversationId, userMessage);
                }
            }
        }
    }

    private static async Task ReadBotMessagesAsync(DirectLineClient client, string conversationId)
    {
        string watermark = null;

        while (true)
        {
            var activitySet = await client.Conversations.GetActivitiesAsync(conversationId, watermark);
            watermark = activitySet?.Watermark;

            var activities = from x in activitySet.Activities
                             where x.From.Id == botId
                             select x;

            foreach (Activity activity in activities)
            {
                Console.WriteLine(activity.Text);

                if (activity.Attachments != null)
                {
                    foreach (Attachment attachment in activity.Attachments)
                    {
                        switch (attachment.ContentType)
                        {
                            case "application/vnd.microsoft.card.hero":
                                RenderHeroCard(attachment);
                                break;

                            case "image/png":
                                Console.WriteLine($"Opening the requested image '{attachment.ContentUrl}'");

                                Process.Start(attachment.ContentUrl);
                                break;
                        }
                    }
                }

                Console.Write("Command> ");
            }

            await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
        }
    }

    private static void RenderHeroCard(Attachment attachment)
    {
        const int Width = 70;
        Func<string, string> contentLine = (content) => string.Format($"{{0, -{Width}}}", string.Format("{0," + ((Width + content.Length) / 2).ToString() + "}", content));

        var heroCard = JsonConvert.DeserializeObject<HeroCard>(attachment.Content.ToString());

        if (heroCard != null)
        {
            Console.WriteLine("/{0}", new string('*', Width + 1));
            Console.WriteLine("*{0}*", contentLine(heroCard.Title));
            Console.WriteLine("*{0}*", new string(' ', Width));
            Console.WriteLine("*{0}*", contentLine(heroCard.Text));
            Console.WriteLine("{0}/", new string('*', Width + 1));
        }
    }
}

Пожалуйста, дайте мне знать, если я делаю что-то не так.

Заранее спасибо


person WPFUser    schedule 11.01.2019    source источник
comment
Я ответил ниже, но я также хотел предложить, что, если это совершенно новый бот, вам действительно стоит подумать об использовании V4 SDK.   -  person Drew Marsh    schedule 11.01.2019


Ответы (1)


Взгляните на отличный пакет узлов Offline DirectLine от моего коллеги Райана Волума. Не позволяйте тому факту, что он основан на узлах, сдерживать вас только потому, что вы пишете бота на основе .NET. Все, что он делает, - это запускает локальный веб-сервер, который имитирует DirectLine API и туннелирует запросы к вашему боту.

Его очень просто использовать, просто следуйте инструкциям по использованию на странице пакета.

person Drew Marsh    schedule 11.01.2019