MS Bot Builder:如何将会话数据设置为主动消息?

时间:2016-06-18 16:45:57

标签: c# botframework

我首先通过OAuthCallback方法中的短信通道向用户发送主动消息

 var connector = new ConnectorClient();
 Message message = new Message();
 message.From = new ChannelAccount { Id = Constants.botId, Address = "+12312311", ChannelId = "sms", IsBot = true };
 message.To = new ChannelAccount { Id = newUserId, Address = "+18768763", ChannelId = "sms", IsBot = false };
 message.Text = $"How are you doing? ";
 message.Language = "en";
 connector.Messages.SendMessage(message);

 IBotData myDataBag = new JObjectBotData(message);

 myDataBag.UserData.SetValue("Username", "Bob");
 myDataBag.PerUserInConversationData.SetValue("Newuser", "yes");

然后在我的主Dialog.cs中尝试访问它

public static readonly IDialog<string> dialog = Chain
    .PostToChain()            
    .Switch(new Case<Message, IDialog<string>>((msg) =>
    {
        var regex = new Regex("hello$", RegexOptions.IgnoreCase);
        return regex.IsMatch(msg.Text);
    },
    (ctx, msg) =>
    {
        // Clearing user related data upon logout
        string isnewuser = ctx.PerUserInConversationData.TryGetValue("Newuser");
        string username = ctx.UserData.TryGetValue("Username");
        return Chain.Return($"Welcome {username}");
    }))
    .Unwrap()
    .PostToUser();

我在手机上收到了这条消息。但是,我无法取回OAuthCallback中保存的用户名和新用户会话数据。

我怀疑这种情况正在发生,因为主动消息没有设置conversationId。而且对话必须以某种方式有所不同。

那么如何在未来的会话中将会话数据设置为我的主动消息呢?

2 个答案:

答案 0 :(得分:0)

在主动方案中,当用户应答您的消息时,频道的对话ID会发生变化,就像一个新的会话一样,我们使用频道数据来执行此类功能,但是此解决方案仅适用于小数据,您还可以使用bot框架用来保存对话框上下文的表存储创建持久会话的选项,在此解决方案中,您可以创建另一个表来存储序列化的数据,最后一个表是使用分布式缓存的持久会话,例如Redis,但是这种类型的服务很昂贵,因此您必须分析哪种类型的解决方案最适合您的解决方案,但是首先,您应该尝试使用Channel Data属性,如果可行,则可以分析另一种方法

希望我能对您有所帮助

答案 1 :(得分:0)

不确定四年后这是否仍然有用,但是我认为我在Access UserProfile from NotifyBot中发现了这一点。看看。