Botframework Bot框架主动消息将Id传递到会话状态

Botframework Bot框架主动消息将Id传递到会话状态,botframework,proactive,Botframework,Proactive,我有一个SMS/Twilio频道,用于向用户发送主动消息。为了发送主动消息,我调用了一个API方法,传入MySpecialId,该方法稍后将在对话中使用 我想把这个MySpecial保存到对话中,但在我有MySpecial的时候,对话还不存在,而且我没有turnContext,所以我还不能真正保存它 是否有方法将此Id从API方法传递到BotCallback?我创建了一个快速示例。(这是我正在使用的原始示例) 谢谢 [HttpGet("{number}")] pu

我有一个SMS/Twilio频道,用于向用户发送主动消息。为了发送主动消息,我调用了一个API方法,传入MySpecialId,该方法稍后将在对话中使用

我想把这个MySpecial保存到对话中,但在我有MySpecial的时候,对话还不存在,而且我没有turnContext,所以我还不能真正保存它

是否有方法将此Id从API方法传递到BotCallback?我创建了一个快速示例。(这是我正在使用的原始示例)

谢谢

        [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);
            }
        }
[HttpGet(“{number}”)]
公共异步任务Get(字符串MySpecialId)
{
//Twillio频道
MicrosoftAppCredentials.TrustServiceUrl(“https://sms.botframework.com/");
var NewConversation=newconversationreference
{
User=newchannelaccount{Id=$“+1{PHONENUMBERTOTEXTHERE}”},
Bot=newchannelaccount{Id=“+1MYPHONENUMBERHERE”},
Conversation=newconversationaccount{Id=$“+1{PHONENUMBERTOTEXTHERE}”},
ChannelId=“sms”,
服务URL=”https://sms.botframework.com/"
};
BotAdapter ba=(BotAdapter)\u HttpAdapter;
wait((BotAdapter)_HttpAdapter).ContinueConversationAsync(_AppId,NewConversation,BotCallback,default(CancellationToken));
返回新的ContentResult()
{
Content=“主动消息已发送。”,
ContentType=“text/html”,
StatusCode=(int)HttpStatusCode.OK,
};
}
专用异步任务BotCallback(ITurnContext turnContext、CancellationToken CancellationToken)
{
尝试
{
var MyConversationState=_ConversationState.CreateProperty(名称(MyConversationData));
var ConversationState=wait MyConversationState.GetAsync(turnContext,()=>new MyConversationData(),cancellationToken);
//********************************************************************************************************************
ConversationState.MySpecialId=//如何从上面的GET方法获取MySpecialId?
//********************************************************************************************************************
wait_ConversationState.saveChangesSync((turnContext,false,cancellationToken);
等待turnContext.SendActivityAsync(“启动主动消息bot回调”);
}
捕获(例外情况除外)
{
此._Logger.LogError(例如消息);
}
}

我不相信您可以。通常,您会通过
活动传递值来执行类似的操作。ChannelData
,但是
ConversationReference
上不存在
ChannelData


根据下面的评论,@Ryan指出,您可以在
ConversationAccount.Properties
上传递数据。但是,注意,这目前仅在C#SDK中可用。我已打开此功能以将其引入节点SDK,但目前还不知道ETA


相反,我建议使用更为C#原生的语言,比如:

  • 创建一个
    ConcurrentDictionary
  • privateCcurrentDictionary\u idMap;
    
  • 将MySpecialId映射到Conversation.Id(在Get函数中)
  • \u idMap.AddOrUpdate(conversationReference.Conversation.Id,MySpecialId,(key,newValue)=>MySpecialId);
    
  • Activity.Conversation.Id
    (在回调中)访问
    MySpecialId
  • var ConversationState=wait MyConversationState.GetAsync(turnContext,()=>new MyConversationData(),cancellationToken);
    ConversationState.MySpecialId=\u idMap.GetValueOrDefault(turnContext.Activity.Conversation.Id);
    
  • 保存会话状态
  • wait ConversationState.saveChangesSync(turnContext,false,cancellationToken);
    

    还有其他方法可以做到这一点,还需要添加一些验证检查,但这应该可以让您开始了。

    谢谢-我只是在ConversationAccount类中签入一个名为Properties的属性,它接受一个JObject。这与您所说的类似-只需在其中放入一个项目字典。可以使用吗?它似乎被传递给了BotCallback方法。谢谢,我忘记了!这实际上应该是可行的。但是,请注意,这(在您的情况下,这很好)。太棒了,非常感谢。只是100%确定,这些属性只用于该对话,不会被转移到其他对话中,对吗?(我的测试显示这只是针对那个对话)再次感谢。@Ryan.Corrent。因为他们与对话参考有关。