![](/img/trans.png)
[英]Add property in azure table storage using Microsoft Bot Services
[英]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:
还有我安装的 SDK:
我的整个实现由四个元素组成,我现在将简要解释一下:
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 Fields , PartitionKey
和RowKey
属性不允许使用字符/
。
所以在方法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.