Разговор всегда возобновляется в веб-сокете канала Directline BOT, как его поддерживать? - PullRequest
1 голос
/ 24 октября 2019

Я создал приложение, которое должно подключаться к Bot DirectLine - каналу веб-сокетов для взаимодействия в разговорах через LUIS и смс с Twilio. Чтобы заставить бот общаться с приложением, я написал контроллер mvc, который передает сообщения. Я не уверен, что этот подход правильный, я сделал это из некоторых образцов. Это работает, но главная проблема в том, что мой код, кажется, всегда начинает новый диалог, когда сообщение получено от клиента, поэтому контекст не поддерживается. Как я могу продолжать разговор и не перезапускать каждое сообщение? Я имею в виду, шаги должны быть, например:Бот: Привет, как тебя зовут? Пользователь: CarlБот: Приятно познакомиться, Карл! вместо этого я получаю:Бот: Привет, как тебя зовут? Пользователь: CarlБот: Извините, я не могу вам помочь с этим.

как разговор возобновляется с нуля.

Вот мой код контроллера (для веб-крючка Twilio установлено значение https://mySmsMVCapp.azurewebsites.net/smsapp/):

public class smsappController : TwilioController
{

    private static string directLineSecret = ConfigurationManager.AppSettings["DirectLineSecret"];
    private static string botId = ConfigurationManager.AppSettings["BotId"];


    const string accountSid = "obfuscated";
    const string authToken = "obfuscated";

    private static string fromUser = "DirectLineSampleClientUser";
    private string SMSreply = "";


    public async Task<TwiMLResult> Index(SmsRequest incomingMessage)
    {

            // Obtain a token using the Direct Line secret
            var tokenResponse = await new DirectLineClient(directLineSecret).Tokens.GenerateTokenForNewConversationAsync();

            // Use token to create conversation
            var directLineClient = new DirectLineClient(tokenResponse.Token);
            var conversation = await directLineClient.Conversations.StartConversationAsync();


        using (var webSocketClient = new WebSocket(conversation.StreamUrl))
        {
            webSocketClient.OnMessage += WebSocketClient_OnMessage;
            // You have to specify TLS version to 1.2 or connection will be failed in handshake.
            webSocketClient.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;
            webSocketClient.Connect();

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

                            await directLineClient.Conversations.PostActivityAsync(conversation.ConversationId, userMessage);
                            //break;

                            if (!string.IsNullOrEmpty(SMSreply))
                            {
                                var messagingResponse = new MessagingResponse();
                                var message = messagingResponse.AddChild("Message");

                                message.AddText(SMSreply); //send text


                                SMSreply = string.Empty;
                                return TwiML(messagingResponse);
                            }

                        }
                    }
                }
            }
        }

        return null;

    }


    private void WebSocketClient_OnMessage(object sender, MessageEventArgs e)
    {
        // Occasionally, the Direct Line service sends an empty message as a liveness ping. Ignore these messages.
        if (!string.IsNullOrWhiteSpace(e.Data))
        {

            var activitySet = JsonConvert.DeserializeObject<ActivitySet>(e.Data);
            var activities = from x in activitySet.Activities
                             where x.From.Id == botId
                             select x;

            foreach (Activity activity in activities)
            {
                if (!string.IsNullOrEmpty(activity.Text))
                {

                    SMSreply = activity.Text;

                }

            }
        }
    }
}

1 Ответ

0 голосов
/ 31 октября 2019

Проблема была в том, что я не сохранял и не извлекал разговор. На данный момент я тестирую с использованием статической переменной для хранения значения. Затем я снова подключаюсь к разговору с ним, и разговор с ботом остается в контексте.

...