- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Bot Builder 3.8.5。
如 Microsoft Bot Framework 文档中所述 here :
By default, the Bot Framework SDK for .NET stores state data using the Bot Framework State service, which is intended for prototyping only and is not designed for use by bots in a production environment. For performance and security reasons in the production environment, you should either use the Bot Builder SDK Azure Extensions to store state data in your own Azure Table storage or Azure DocumentDB store or create a custom implementation of IBotDataStore to store state data in the destination that you specify.
我决定将 Bot 构建器扩展与 Azure 表存储结合使用。状态已正确保存到表存储中。
但是,我有以下问题:
在MessageController.cs
中,我添加了一个私有(private)对话数据字符串,如下所示(因为我无权访问IDialogContext
):
StateClient stateClient = activity.GetStateClient();
BotData userData = await stateClient.BotState.GetPrivateConversationDataAsync(activity.ChannelId, activity.Conversation.Id, activity.From.Id);
userData.SetProperty<string>("MyKey", "MyValue");
await stateClient.BotState.SetPrivateConversationDataAsync(activity.ChannelId, activity.Conversation.Id, activity.From.Id, userData);
然后在我的 RootDialog 文件中,我尝试通过执行以下操作来提取此数据:
context.PrivateConversationData.TryGetValue("MyKey", out myValue);
但是context.PrivateConversationData不包含这个键,它总是返回null。
注意:当我使用默认的机器人状态服务时,它工作得很好...
如果我使用以下代码,它可以工作,但会对性能产生重大影响(检索机器人数据的调用非常慢):
var stateClient = context.Activity.GetStateClient();
BotData pConversationData = context.Activity.GetStateClient().BotState.GetPrivateConversationDataAsync( context.Activity.ChannelId, context.Activity.Conversation.Id, context.Activity.From.Id).GetAwaiter().GetResult();
return pConversationData.GetProperty<T>("MyKey");
我做错了什么?
更新
似乎覆盖 IBotDataStore(使用机器人构建器扩展)适用于 context.UserData,但不适用于 StateClient.BotState...事实上,我认为我也需要为 IBotState 有一个自定义实现才能在 IDialog 之外访问 BotState..
最佳答案
我想我找到了解决这个问题的方法。问题是,如果您想访问 IDialog 外部的 Bot 状态,则无法访问 IDialogContext 和 context.PrivateConversationData 或 context.UserData,它们正在处理 bot 状态的加载/保存/刷新。
如果您使用默认的机器人状态服务,则可以使用 StateClient,但是当您有自定义 IBotDataStore(按照机器人框架文档中的建议)时,您不能使用默认的 StateClient,因为它仍然指向默认状态服务。我想一种解决方案可能是创建自定义 IStateClient/IBotState。
相反,我在 MessageController 中使用了以下代码:
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
{
var botData = scope.Resolve<IBotData>();
await botData.LoadAsync(default(CancellationToken));
botData.PrivateConversationData.SetValue<T>("MyKey", value);
await botData.FlushAsync(default(CancellationToken));
}
使用此代码,我能够在自定义 IBotDataStore 中保存/加载数据。
希望这有帮助!
关于c# - 自定义 IBotDataStore 破坏 context.PrivateConversationData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45076052/
我正在使用 Bot Builder 3.8.5。 如 Microsoft Bot Framework 文档中所述 here : By default, the Bot Framework SDK fo
我是一名优秀的程序员,十分优秀!