Идентификатор прохождения превентивного сообщения в платформе Bot Framework в состояние разговора - PullRequest
1 голос
/ 05 июня 2019

У меня есть канал SMS / Twilio, который я использую для отправки Проактивного сообщения пользователю. Чтобы отправить Проактивное сообщение, я вызываю метод API, передавая MySpecialId , который используется позже в разговоре.

Я хочу сохранить этот MySpecialId в диалоге, но в тот момент, когда у меня есть MySpecialId, диалог еще не существует, и у меня нет turnContext, поэтому я пока не могу его сохранить.

Есть ли способ передать этот идентификатор из моего метода API в BotCallback? Я создал быстрый пример. (Вот оригинальный пример, который я использую https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/16.proactive-messages)

Спасибо

        [HttpGet("{number}")]
        public async Task<IActionResult> Get(string MySpecialId)
        {
            //For Twillio Channel
            MicrosoftAppCredentials.TrustServiceUrl("https://sms.botframework.com/");

            var NewConversation = new ConversationReference
            {
                User = new ChannelAccount { Id = $"+1{PHONENUMBERTOTEXTHERE}" },
                Bot = new ChannelAccount { Id = "+1MYPHONENUMBERHERE" },
                Conversation = new ConversationAccount { Id = $"+1{PHONENUMBERTOTEXTHERE}" },
                ChannelId = "sms",
                ServiceUrl = "https://sms.botframework.com/"
            };

        BotAdapter ba = (BotAdapter)_HttpAdapter;
            await ((BotAdapter)_HttpAdapter).ContinueConversationAsync(_AppId, NewConversation, BotCallback, default(CancellationToken));

            return new ContentResult()
            {
                Content = "<html><body><h1>Proactive messages have been sent.</h1></body></html>",
                ContentType = "text/html",
                StatusCode = (int)HttpStatusCode.OK,
            };
        }

      private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
        {
            try
            {
                var MyConversationState = _ConversationState.CreateProperty<MyConversationData>(nameof(MyConversationData));
                var ConversationState = await MyConversationState.GetAsync(turnContext, () => new MyConversationData(), cancellationToken);

                //********************************************************************************************************************
                ConversationState.MySpecialId = //HOW DO I GET MySpecialId FROM THE GET METHOD ABOVE HERE?
                //********************************************************************************************************************

                await _ConversationState.SaveChangesAsync((turnContext, false, cancellationToken);
                await turnContext.SendActivityAsync("Starting proactive message bot call back");                    
            }
            catch (Exception ex)
            {
                this._Logger.LogError(ex.Message);
            }
        }

1 Ответ

1 голос
/ 06 июня 2019

Я не верю, что ты можешь.Обычно вы делаете что-то подобное, передавая значения через Activity.ChannelData, но ChannelData не существует в ConversationReference.


В комментариях ниже @Ryan указал, что вы можете передатьданные по ConversationAccount.Properties.Обратите внимание, однако, что в настоящее время это доступно только в C # SDK.Я открыл проблему , чтобы перенести это в Node SDK, но ETA на данный момент неизвестна.


Вместо этого я бы предложил использовать нечто более родное для C #, например:

  1. Создать ConcurrentDictionary
private ConcurrentDictionary<string, string> _idMap;
Карта MySpecialId на Conversation.Id (в вашей функции Get)
_idMap.AddOrUpdate(conversationReference.Conversation.Id, MySpecialId, (key, newValue) => MySpecialId);
Доступ к MySpecialId из Activity.Conversation.Id (в BotCallback)
var ConversationState = await MyConversationState.GetAsync(turnContext, () => new MyConversationData(), cancellationToken);
ConversationState.MySpecialId = _idMap.GetValueOrDefault(turnContext.Activity.Conversation.Id);
Сохранить ConversationState
await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);

Есть и другие способы, которыми вы могли бы сделать это, и некоторые проверки правильности, которые вам нужно добавить, но это должно помочь вам начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...