c# - 在 Azure 中检索聊天机器人对话数据

标签 c# azure-storage botframework azure-table-storage azure-cognitive-services

首先简要介绍一下背景:Bot 框架将对话数据存储在 Azure 表/Cosmos DB(在我的例子中是 Azure 表)的存储中。对于每个对话,都会在 Azure 表中创建一个条目,其中包含时间戳、用户 ID、对话消息和其他详细信息。

我正在尝试使用 C# 中的自定义代码从 Azure 表存储中检索对话详细信息,如下所示。

Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(connectionString);
Microsoft.WindowsAzure.Storage.Table.CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("botdata");
TableQuery<DynamicTableEntity> projectionQuery = new TableQuery<DynamicTableEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "directline:user"));
var dataRow = table.ExecuteQuery(projectionQuery).Where(q => q.RowKey == "souvik").FirstOrDefault();
var conversation = Encoding.UTF8.GetString(dataRow.Properties["Data"].BinaryValue);
Console.WriteLine(conversation);

我收到了一些乱码,类似这样的内容 - \u001f�\b\0\0\0\0\0\u0004\0��\u0005\0C����\u0002\0\0\0 当我在 Azure 表存储中检索以二进制格式存储的数据时。 Azure 存储资源管理器中的数据如下所示-

enter image description here

我已经尝试并测试了每个对话,我发现每次我输入数据并将其发送到机器人并获得响应时,新记录都会以正确的时间戳添加到 Azure 表中。这是检索数据的正确方法还是我做错了什么?让我知道是否可以添加更多详细信息。

更新-1:

我已经提到了这个- How to retrieve Saved Conversation Data in Azure (Tablelogger)但对我的问题没有太大帮助。

Update-2

根据 Fei 下面的回答,我注意到当我将 PartitionKey 用作 directline:userdirectline:conversation 时,我得到了反序列化值为 {} 但如果我使用 directline:private 我会得到这样的东西 -

{"ResumptionContext":{"locale":"en-US","isTrustedServiceUrl":true}, “DialogState”:“H4sIAAAAAAAEAO1a328iVRRmYGYKbTfbdZtNzLq7GM26DWS2FGi7MVUptUrcVi1VYxrSvcCFjh1mmrl3quyjb74YEx+N/hW+uzFxE/8KX9fsH6HnzAxQ7A8GhHpZoemBDs O953znO+d+99KQFAqF/oIHPuNjNgzm8y29YlvMqnFt3YJfRzeq1E7GP6U20y1zLa2llrQlLZOM5x2DOzZdM6nDbWIk4x85ZUOvfECbu9YhhTtT5Vp6NbtMqunlDE1nFZznF+nM8bWCpmyalt 3oZpvKeHqX29s6+f0MnhlVnJz7nXdkl7DAZH1kMpVIEglAYJ5VDtWaTBmXKl0TnLCLLT8LFJuO0oeUtw6AVDjMx7T1qUluvaA91xs+P5lT0hU0cW8DwRzo4CYhOESAlhv6YIMahJIrdsWj rjd3m0e06Ni2VSecJj4sfwGp2KE1alN4Gxl+ObPgbwzJEpPRKGBk/HPCkmFUoLqvA4ZM2Wf6YxrdP/aGBaR/DdpfhMVur4TUiUZjqs8i5I8iXwpxsUPLeEfkjs/ST0ydN7sGfN/CWGRV16 /FWBTMFDodkvxL8pOxz4YbZwzNNJgrYRlj7gUOMlTeIJzE3DsQ0NkcY7RRNprbEKcUkqLqDNz0NPBqiPBskgrksikgSphsdXak6kFy6YXzXAHzW1DgPoPFWWWzcYoibEutLGwlcLHKD2Icyai JZvpyV9odwH1x4tCQaask9v5t4oSXjDVaxbEMvd0bPaIv403vw8soKyVayy6kH6QxdXH3gpcTtYVfRzGFzxkbmdrRraF7CS1dbPfw6cnFuAmpvUGWbMi6blFZlOTBYO/CZ/yNYiYD4bAOcbcb OIxefw/60n0+j9Jg6JoZD9/dD0bAvRhSk+tNxp3T32HnLNCkubFphizJG6jQHu4lj0Bv/9KJ95xC7/An2B8ZVVPYLhOtAhXIDWf4nFMpz/zBHwqZ+rf3Ws5NvXW/JqJdDfeyCHPNth3D 0VDz/axbopJxlK3Y3Zdw0FMqJ3adcrVB+YFVjcg9t3s/nUOUi3BK7B445iHg7HhiddSLzH1/AhCH/sGKtgVbLmoXzJp13hb2JppX0NxCCt3oZ50QlUKC9LPB2fb7ENgmCAgDE/M2mjto4ti2 7ba9quTJndxK+isB1jWojcuXJNV251K/qaHr55HuRr3vhi5lG3ja1jEtwYgMZJVxsOurpOvWN4gjLmvinrdJOjWdPvV0rQ3JG755/wz8Zxdh6BNziR8hCLRK74jeNNeSX0d50GeuzlX745B 3wMmvI604DmxKqrpZ19AP5lrwIOjBqa/K+o+4VIojbPcCn9D6X8gNMNM5zWSQBnSGYwVAEfzqyhhMeQrePJ4nGYbLUTc1C+o9SMQz5eJE9JsJwZrtaL+LGYxCYwLRcPk50pYSiO354gpiY4SiO354 WJ1h2azOuIDpRsL5B+PalPfu5PnwgSQVvKJFBHo5hGOaMmu3WD9mKlTb0P8fw4kRjDbeFBkxtQfSxCjr5XJ+pjoj4uQX0I0piCCxUFt54CbYkHP876tkcQ+QOim4mHlnXkXRH2sDSSFZglNG zax2YOYur4lQrql+kYhoJr8njKisHpcLfbryJpHBlU83DUdiyLe4FnBs1SFs0ymhVUPKmW3l8Vq546khkZJVqNoO6dzkE3rdAqNbncR9LCLfyldEtsvglmxseWNc2KpznXBIxbfQuc+k66QJTET8 RxztrbXrm8F1B5nH7Fe65zOfyvIVI26KnTnAX1bXDrj//erZFi72/Qs62CfWdsm2OntrEOAtYO3BnC+pFWWmWzDmbe93wHKlE/plU3wWr+Xy896kZwz9R33UxcxL6zvBwdDQNvRBbUTdxkhMVxXRSKesU28zeNVmRMBTMAAA=="}

感觉上面JSON中的DialogState数据需要解密?

对于我键入的每条消息和收到的响应,Azure 表中都会插入三个记录,每个记录都有不同的 PartitionKey,它们是 - directline:privatedirectline:userdirectline:conversation

最佳答案

Azure Table Storage 中的二进制数据存储为 Base64 编码字符串。您需要做的是先将此字符串转换为字节,然后从这些字节中获取字符串。

类似于:

var conversation = Encoding.UTF8.GetString(Convert.FromBase64String(dataRow.Properties["Data"].BinaryValue));

关于c# - 在 Azure 中检索聊天机器人对话数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49876666/

相关文章:

azure - 我可以使用一些中间 API 将诊断数据传输到不同帐户的 Azure 存储吗

azure - 我可以在 Azure 表存储中保存 1MB 文件中的一些 JSON 数据吗?

c# - 如何从复杂的自适应卡中读取值?

node.js - Microsoft BotBuilder node.js : How to send formatted text (BOLD , 斜体(换行))到 Android Skype for Business 客户端(从 Bot)

c# - 在 c# asp.net 中登录后禁用 Web 浏览器后退按钮

c# - 使用私钥 X.509 证书解密

c# - java是否有类似于C#属性的东西?

c# - 如何在 c# .NET 的方法中参数化 Azure TableOperation.Retrieve<Element>

azure - 第二个 ConversationUpdate 事件将在用户第一次输入之后发生?

c# - 如何在不淡化文本的情况下禁用文本框?