【发布时间】:2018-03-04 11:34:48
【问题描述】:
我正在尝试用 Azure 提供的 Cosmos 存储替换 InMemory 存储。
我在对话数据中存储了一些信息,在我的对话中使用它,如果发送了某个命令,我会从我的消息控制器中重置它。
我在对话中访问对话数据的方式是:
context.ConversationData.GetValueOrDefault<String>("varName", "");
我在 messageContoller 中重置数据的方式是:
StateClient stateClient = activity.GetStateClient();
BotData userData = await stateClient.BotState.GetConversationDataAsync(activity.ChannelId, activity.Conversation.Id);
userData.RemoveProperty("varName");
await stateClient.BotState.SetConversationDataAsync(activity.ChannelId,
activity.Conversation.Id, userData);
如果我使用 InMemory,前一行代码可以正常工作。一旦我切换到 cosmos,代码的重置部分就会失败。在调试问题时,我发现返回的对话数据对象与从对话框中返回的对象不同,我无法重置变量。
这是我连接到 cosmos 数据库的方式:
var uri = new Uri(ConfigurationManager.AppSettings["DocumentDbUrl"]);
var key = ConfigurationManager.AppSettings["DocumentDbKey"];
var store = new DocumentDbBotDataStore(uri, key);
Conversation.UpdateContainer(
builder = >{
builder.Register(c = >store).Keyed < IBotDataStore < BotData >> (AzureModule.Key_DataStore).AsSelf().SingleInstance();
builder.Register(c = >new CachingBotDataStore(store, CachingBotDataStoreConsistencyPolicy.ETagBasedConsistency)).As < IBotDataStore < BotData >> ().AsSelf().InstancePerLifetimeScope();
});
知道为什么会这样吗?
编辑:
当使用 im 内存存储时,此代码可以正常工作,但用 cosmos 存储替换存储无法检索对话框外的对话数据(对话框正确获取/设置对话数据,但 StateClents 无法检索数据正确它返回一个空对象,但奇怪的是它与从对话框返回的会话 ID 相同)
【问题讨论】:
标签: c# botframework azure-cosmosdb