Контроллер сообщений BotFramework устанавливает переменную через Backchannel - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь получить номер int (1-4) через Backchannel, а затем передать его первому диалоговому окну.

Мой контроллер сообщений выглядит следующим образом:

       private int option = 1;
    /// <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)
        {
            try
            {

                var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                Activity isTypingReply = activity.CreateReply();
                isTypingReply.Type = ActivityTypes.Typing;
                await connector.Conversations.ReplyToActivityAsync(isTypingReply);

                await Conversation.SendAsync(activity, () => new Dialogs.MenuDialog(option));


            }
            catch (Exception e)
            {
                //SendEmail(e);
            }
        }
        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)
        {

        }
        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)
        {
        }
        else if (message.Type == ActivityTypes.Event && message.Name == "option")
        {

           // var reply = message.CreateReply();
            //reply.Text = message.Value.ToString();
           // ConnectorClient connector = new ConnectorClient(new Uri(message.ServiceUrl));
           // await connector.Conversations.ReplyToActivityAsync(reply);

            if (message.Value.ToString() == "1")
            {
                option = 1;

            }
            else if (message.Value.ToString() == "2")
            {
                option = 2;
            }
            else if (message.Value.ToString() == "3")
            {
                option = 3;
            }
            else if (message.Value.ToString() == "4")
            {
                option = 4;
            }
            else
            {
                option = 1;
            }

        }


        return;
    }

Метод Backchannel вызывается вправо, и значение параметра устанавливается, когда я печатаю его в конце функции.Но затем, когда приходит первое сообщение, бот всегда использует значение по умолчанию «1».Он работал раньше, но теперь перестал работать, и я не понимаю, почему.

1 Ответ

0 голосов
/ 05 марта 2019
private int option = 1;

Обрабатывается в MessageController и обновляется при каждом вызове.Вы можете использовать PrivateConversationData для сохранения «опции» между вызовами «Событие» и «Сообщение»:

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {
        //retrieve the option value before processing the message
        string optionValue = string.Empty;
        using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
        {
            var botData = scope.Resolve<IBotData>();
            await botData.LoadAsync(CancellationToken.None);
            optionValue = botData.PrivateConversationData.GetValue<string>("option");
        }

        await Conversation.SendAsync(activity, () => new ParameterizedRootDialog(optionValue));

    }
    else if (activity.Type == ActivityTypes.Event)
    {
        var eventActivity = activity.AsEventActivity();
        if (string.Equals(eventActivity.Name, "option", StringComparison.InvariantCultureIgnoreCase))
        {
            //save the option into PrivateConversationData
            string optionValue = eventActivity.Value.ToString();
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
            {
                var botData = scope.Resolve<IBotData>();
                await botData.LoadAsync(CancellationToken.None);
                botData.PrivateConversationData.SetValue("option", optionValue);
                await botData.FlushAsync(CancellationToken.None);
            }                    
        }
    }

    return Request.CreateResponse(HttpStatusCode.OK);
}

Также обратите внимание: при использовании этого метода нет необходимости отправлять опцию в диалог в качестве параметра.Вы можете получить значение из самого диалога, используя IDialogContext.PrivateConversationData.Как это:

var optionFromContext = context.PrivateConversationData.GetValue<string>("option");
...