首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BOT框架-使用Cosmos DB进行状态管理

BOT框架-使用Cosmos DB进行状态管理
EN

Stack Overflow用户
提问于 2018-04-10 13:25:34
回答 1查看 436关注 0票数 1

我已经使用Cosmos DB在我的BOT框架中启用了日志记录和状态mgmt,如下所示

使用Cosmos DB管理状态

我还在我的Global.ascx中添加了以下代码

代码语言:javascript
复制
rotected void Application_Start()
{
    Conversation.UpdateContainer(
        builder =>
        {
            builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));
            // Bot Storage: register state storage for your bot
            var uri = new Uri(ConfigurationManager.AppSettings["DocumentDBUri"]);
            var key = ConfigurationManager.AppSettings["DocumentDBKey"];
            var store = new DocumentDbBotDataStore(uri, key);
            builder.Register(c => store)
                .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
                .AsSelf()
                .SingleInstance();
        });

    GlobalConfiguration.Configure(WebApiConfig.Register);
}

Azure文件DB:

代码语言:javascript
复制
{
"id": "emulator:private52mgl3acgcke:default-user",
"botId": "lg3443gthi57gd",
"channelId": "emulator",
"conversationId": "52mgl3acgcke",
"userId": "default-user",
"data": {
    "ResumptionContext": {
        "locale": "en-US",
        "isTrustedServiceUrl": false
    },
    "DialogState": "H4sIAAAAAAAEAO1b22/bVBhPWsdNso6Oq7gMFgQMSlt3SZpeRjeWpOoI62VaOhCqquzYPklNHTv4HHdkjzzBy4TEI4J/ASHxDkICib+CVxB/RPk+20nTNG2c0BQX6ilfk/hcvsvvfN/vnHihcCgU2oML/+I1OgTio1VNsUxmlrmUM+Fla7pKrcnEB9RimmncSEvJlJSSZiYTeVvntkVvGNTmFtEnE3dtWdeUO7S+Ye5QaJmUy+n5zCxR07MzNJ2J4Dw/hjuOLxUMTi2D6Exa1mSYyv3zILm52bn9kkZ0s8Ja+rnfbBC2M5kYmA1bW8NgRIRxouyIZYtUKYs8JBpnw4Lw01CxzjitSnlT16nCYSYm3aYGtTRFWtEYP9qaQ9YXlnHsAJo/0MGJT+8UwaVE1x4R9PFEkZsWLRgQE0OhufpGvUaLtmWZFcLpxLr8MYTiHi1Ti8JtRPjpzIKvGIIlJqCIgBDw4zlKTmIFiiUNfMgiJaY9otHSrjssePpnv/klsL7b3 "
},
"_rid": "JnhaAKnGzgEJAAAAAAAAAA==",
"_self": "dbs/JnhaAA==/colls/JnhaAKnGzgE=/docs/JnhaAKnGzgEJAAAAAAAAAA==/",
"_etag": "\"00002f19-0000-0000-0000-5a56565655000\"",
"_attachments": "attachments/",
"_ts": 1523330900

}

代码语言:javascript
复制
  using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
            {
                var botDataStore = scope.Resolve<IBotDataStore<BotData>>();
                var key = new AddressKey()
                {
                    BotId = message.Recipient.Id,
                    ChannelId = message.ChannelId,
                    UserId = message.From.Id,
                    ConversationId = message.Conversation.Id,
                    ServiceUrl = message.ServiceUrl
                };
                var userData = await botDataStore.LoadAsync(key, BotStoreType.BotConversationData, CancellationToken.None);

                userData.SetProperty("userId", UserID);

                userData.SetProperty("DOB", DOB);

                BotData botdata = new BotData();


                await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);

现在,我想在我的状态中为用户添加自定义用户数据(Ex、name、email和道布),并将其用于完整的对话--我无法找到处理它的最佳方法。

(context.UserData.SetValue -工作,但我希望它的状态客户端,而不是更新它在宇宙数据库)

代码语言:javascript
复制
context.UserData.SetValue("username", "John Smith");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-11 22:33:01

不相关,但实际上可以将代码的var key部分更改为var key = Address.FromActivity(message);

使用下面的代码,我在屏幕截图中得到了结果,有一些不同之处,其中之一是我没有使用代码BotData botdata = new BotData();中的这一行,我还添加了这一行await botDataStore.FlushAsync(key, CancellationToken.None);,我的代码与您在global.asax中的代码完全相同

代码语言:javascript
复制
        if (activity.Type == ActivityTypes.Message)
        {

            var message = activity as IMessageActivity;
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
            {
                var botDataStore = scope.Resolve<IBotDataStore<BotData>>();
                var key = Address.FromActivity(message);

                ConversationReference r = new ConversationReference();
                var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

                userData.SetProperty("userId", "123");

                userData.SetProperty("DOB", "some date");

                await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);
                await botDataStore.FlushAsync(key, CancellationToken.None);
            }
            await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());

        }

我在我的cosmosDB中得到了这个结果

希望这对你有帮助

编辑4/12/2018

来回答你的后续问题。要使它成为这样一个代码已经运行过的代码,您只需要检查这个值是否存在于键上,修改我给您的代码片段,如下所示:

代码语言:javascript
复制
if (userData.GetProperty<string>("userId") == null)
{    
    userData.SetProperty("userId", "123");
    userData.SetProperty("DOB", "some date");
    await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);
    await botDataStore.FlushAsync(key, CancellationToken.None);
}

由于您没有访问上下文对象的权限,所以代码的其余部分需要运行,以便每次检查状态。

要回答关于用户关闭和重新打开窗口的另一个问题,应该将其保存到您的cosmosDB中,而这不应该是一个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49754874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档