我首先通过 OAuthCallback 方法中的 sms channel 向用户发送主动消息
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 中的用户名和新用户 session 数据。
我怀疑这是因为主动消息没有设置 sessionId。并且 sessionId 必须以某种方式不同。
那么我怎样才能让它在 future 的对话中将 session 数据设置为我的主动消息呢?
最佳答案
在proactive的场景中,当用户回复你的消息时, channel 的 session ID会发生变化,就像一个新的 session ,我们使用 channel 数据来做这种类型的功能,但是这个解决方案只针对小数据,你也可以选择创建使用与机器人框架用于保存对话上下文相同的表存储的持久 session ,在此解决方案中,您可以创建另一个表来存储序列化的数据,最后一个是使用分布式缓存(如 Redis)的持久 session ,但是这种类型的服务很昂贵,因此您必须分析哪种类型的解决方案适合您的解决方案,但首先,您应该尝试使用 Channel Data 属性,如果它有效,您可以分析另一种方法
我希望我有所帮助
关于c# - MS Bot Builder : how to set session data to proactive message?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37899365/