首页 > 解决方案 > 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);
        }

标签: c#botframeworkbots

解决方案


在您获取状态数据之前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:持久化的数据将可供同一对话中的所有用户使用。


推荐阅读