c# - Bot Framework 在活动事件的内存存储中使用
问题描述
尝试从 ActivityTypes.Event 存储数据,但在尝试从 Rootdialog 访问它时它是空的。当我在 ActivityTypes.Event 中移动代码时,它工作正常。
消息控制器:
if (activity.Type == ActivityTypes.Event)
{
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
{
var botDataStore = scope.Resolve<IBotDataStore<BotData>>();
var key = Address.FromActivity(activity);
var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);
//set state data
userData.SetProperty("key 1", "value1");
//get state data
userData.GetProperty<string>("key 1");
await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);
await botDataStore.FlushAsync(Key, CancellationToken.None);
}}
if (activity.Type == ActivityTypes.Message)
{
await Typing.SendTyping(activity);
await Task.Delay(TimeSpan.FromSeconds(2));
await Conversation.SendAsync(activity, () => new RootDialog());
}
根对话框:
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var activity = await argument as Activity;
string s;
context.UserData.TryGetValue<string>("key 1", out s);
await context.PostAsync(s);
}
解决方案
在您获取状态数据之前RootDialog
,请确保MessagesController
执行了您定义的用于保存状态数据的代码片段。
我根据您提供的代码进行了测试,并Event
从我的网络聊天客户端发送了一个活动,如下所示:
botConnection.postActivity({
type: 'event',
from: userinfo,
}).subscribe(function (id) { console.log('you send an event activity'); });
我可以按预期保存和检索UserData 。
笔记:
内存数据存储仅用于测试。在生产环境中,出于性能和安全原因,您可以将状态数据存储在 Azure 表存储或 Azure Sql Server 等中,或者实现自己的数据存储。
更新:
UserData:用户之前保存的数据将只对指定的用户可用。
ConversationData:持久化的数据将可供同一对话中的所有用户使用。