繁体   English   中英

如何通过 Microsoft Bot Framework 将记录插入 Azure 表存储?

[英]How to insert records to Azure Table Storage via Microsoft Bot Framework?

目前我正在使用带有 C# 的 Bot Framework 4.0,并且我正在尝试实现一个解决方案,将来自用户的消息存储在 Azure 表存储中。 我已经想出了一个实现这个目标的想法,但是当我通过 Bot Framework Emulator 对其进行测试时,我的方法只能在本地工作。

当我将代码发布到我的机器人到 Azure 时,消息不会存储在表存储中。 我有点困惑,因为我真的不知道为什么会这样。 我已经检查了 App Insights,但显示的信息对我没有太大帮助。

这些是我安装的 Nugget-Packages:

  • azure.identity\1.3.0\
  • azure.security.keyvault.secrets\4.1.0\
  • microsoft.aspnetcore.app\2.1.1\
  • microsoft.azure.cosmos.table\1.0.8\
  • microsoft.bot.builder.ai.luis\4.7.0\
  • microsoft.bot.builder.ai.qna\4.7.0\
  • microsoft.bot.builder.dialogs\4.9.4\
  • microsoft.bot.builder.integration.aspnet.core\4.7.0\

还有我安装的 SDK:

  • Microsoft.AspNetCore.App 2.1.1
  • Microsoft.NetCore.App 2.1.0

我的整个实现由四个元素组成,我现在将简要解释一下:

        private static CloudTable GetTableReference()
        {
            var storageAccount = CloudStorageAccount.Parse("<connection-string>");
            var tableClient = storageAccount.CreateCloudTableClient();

            return tableClient.GetTableReference("<table-name>");
        }

第一种方法是打包 Azure 表存储的凭据。 该术语是一个占位符,代表 Azure 表存储的连接字符串。 是表存储名称的占位符(显然)。

private static void InsertRecord(ITurnContext<IMessageActivity> turnContext, CloudTable table)
        {
            string partitionKey = DateTime.Now.ToString();
            string rowKey = DateTime.Now.ToString();

            var Eintrag = new UserEntity(partitionKey, rowKey)
            {
                UserStatement = $"{turnContext.Activity.Text}",
            };

            var insertOperation = TableOperation.Insert(Eintrag);
            table.ExecuteAsync(insertOperation);
        }

第二种方法为表存储准备内容。 例如,用户的消息也存储在“UserStatement”变量中,还有一个时间戳。

protected async Task NoMatchFound(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var table = GetTableReference();
            InsertRecord(turnContext, table);

            // Wird ausgeführt, wenn keine KnowledgeBase gefunden wird
            System.Diagnostics.Debug.WriteLine("### FINDE KEINE PASSENDE ANTWORT ###");
            await turnContext.SendActivityAsync(MessageFactory.Text("Leider kann ich Ihnen hierbei noch nicht weiterhelfen. Ich bin aber schon dabei, Neues zu lernen!"), cancellationToken);
        }

在最后一种方法中,所有内容都放在一起并最终执行。 这三个提到的方法在同一个名为“Dispatchbot.cs”的文件中(我使用了 NLP 和 Microsoft 为我的机器人提供的 Dispatch 示例)。

using Microsoft.Azure.Cosmos.Table;
using System;

namespace TableStorage
{
    public class UserEntity : TableEntity
    {
        public UserEntity(string partitionKey, string rowKey)
        {
            PartitionKey = partitionKey;
            RowKey = rowKey;
        }

        public UserEntity()
        {
        }

        public string UserStatement { get; set; }

    }
}

我拥有的最后一件事是另一个名为“UserEntity.cs”的文件,其中表条目的内容被打包。 整个实现肯定更容易实现。

我唯一需要做的就是调用 NoMatchFound() 方法,用户的输入应该存储在 Azure 表存储中。 但如果我尝试在线测试,情况并非如此。

这是一个视频,我展示了表存储记录在本地没有任何问题: https://youtu.be/fFtzjmOfQDs

我还将附上我的应用洞察力的屏幕截图 - 也许这会有所帮助。

我希望你能帮助我,如果我需要添加更多信息。 随时要求。

我看了你提供的视频,发现在你的本地机器上, datetime时间是这样的格式: 18.01.2021 17:35:59

所以我认为根本原因是当它部署到 azure 时, datetime时间是这种格式: 1/19/2021 10:09:31 AM 并且根据此文档Characters Disallowed in Key FieldsPartitionKeyRowKey属性不允许使用字符/

所以在方法private static void InsertRecord(xxx)中,请使用Replace方法将字符/替换为字符. 或其他允许的字符。 如下所示:

    private static void InsertRecord(ITurnContext<IMessageActivity> turnContext, CloudTable table)
    {

        //replace the character / with character .
        string partitionKey = DateTime.Now.ToString().Replace('/','.');
        string rowKey = DateTime.Now.ToString().Replace('/','.');

        var Eintrag = new UserEntity(partitionKey, rowKey)
        {
            UserStatement = $"{turnContext.Activity.Text}",
        };

        var insertOperation = TableOperation.Insert(Eintrag);
        table.ExecuteAsync(insertOperation);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM