在 Azure Table 存储中写入后抛出异常
Exception thrown after writing in Azure Table Storage
我正在将 Microsoft Azure Table 存储与 Microsoft Bot Framework 结合使用。我的目标是,机器人将所有传入消息直接写入 Table 存储。这连续工作了两周,没有任何问题。但是自一两周前以来,机器人不会写下消息,我也没有更改代码中的任何内容 - 但为什么呢?
这是机器人在记下用户消息时执行的方法:
protected async Task TableStorageEintrag(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Schlüssel für den Table-Zugriff
string accountKey = "MY STORAGE ACCOUNT KEY 1";
string accountName = "MY STORAGE ACCOUNT NAME";
// Schlüssel werden hier für den Table-Eintrag zusammengepackt
TableQueries tableQueries = new TableQueries
{
accountKey = accountKey,
accountName = accountName
};
// Werte für den Table-Eintrag
string rowKey = DateTime.Now.ToString();
string partitionKey = rowKey;
string userStatement = $"{turnContext.Activity.Text}";
System.Diagnostics.Debug.WriteLine(rowKey);
System.Diagnostics.Debug.WriteLine(partitionKey);
System.Diagnostics.Debug.WriteLine(userStatement);
// Methode für den Table-Eintrag wird hier ausgeführt
Task<bool> bLinkCreated = tableQueries.InsertURL(partitionKey, rowKey, userStatement);
bLinkCreated.Wait();
// 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);
}
这是输入的地方:
public class TableQueries
{
public string accountKey { get; set; }
public string accountName { get; set; }
public async Task<bool> InsertURL(string partitionKey, string rowKey, string userStatement)
{
bool bSuccess = false;
CloudStorageAccount storageAccount = new CloudStorageAccount(new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(accountName, accountKey), true);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable linkTable = tableClient.GetTableReference(accountName);
// linkTable.CreateIfNotExists();
await linkTable.CreateIfNotExistsAsync();
// Erstelle eine neue Entität
LinkEntity link = new LinkEntity(partitionKey, rowKey);
// Füge im neuen Table-Eintrag die Nachricht des Benutzers hinzu
link.userStatement = userStatement;
// Create the TableOperation that inserts the customer entity.
TableOperation insertOperation = TableOperation.InsertOrMerge(link);
try
{
await linkTable.ExecuteAsync(insertOperation);
bSuccess = true;
}
catch (Exception e)
{
bSuccess = false;
}
return bSuccess;
}
}
LinkEntry.cs:
public class LinkEntity : TableEntity
{
public LinkEntity(string partitionKey, string rowKey)
{
PartitionKey = partitionKey;
RowKey = rowKey;
}
public LinkEntity() { }
public string userStatement { get; set; }
}
LinkSummary.cs
public class LinkSummary
{
public string userStatement { get; set; }
}
这是我正在使用的 Nugget 包:
抛出异常:'Microsoft.WindowsAzure.Storage.StorageException' in System.Private.CoreLib.dll
一个可能的原因是 PartitionKey
或 RowKey
中有一些不正确的字符。无效字符请参考this doc。并确保您没有插入具有相同 PartitionKey
和 RowKey
的记录,这也会导致错误。
你还应该检查评论中提到的异常,它可以获得查找根本原因的详细信息。
顺便说一下,您使用的包 WindowsAzure.Storage
真的很旧。如果可能,您应该使用最新的包 Microsoft.Azure.Cosmos.Table 用于 azure table 存储。
我正在将 Microsoft Azure Table 存储与 Microsoft Bot Framework 结合使用。我的目标是,机器人将所有传入消息直接写入 Table 存储。这连续工作了两周,没有任何问题。但是自一两周前以来,机器人不会写下消息,我也没有更改代码中的任何内容 - 但为什么呢?
这是机器人在记下用户消息时执行的方法:
protected async Task TableStorageEintrag(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Schlüssel für den Table-Zugriff
string accountKey = "MY STORAGE ACCOUNT KEY 1";
string accountName = "MY STORAGE ACCOUNT NAME";
// Schlüssel werden hier für den Table-Eintrag zusammengepackt
TableQueries tableQueries = new TableQueries
{
accountKey = accountKey,
accountName = accountName
};
// Werte für den Table-Eintrag
string rowKey = DateTime.Now.ToString();
string partitionKey = rowKey;
string userStatement = $"{turnContext.Activity.Text}";
System.Diagnostics.Debug.WriteLine(rowKey);
System.Diagnostics.Debug.WriteLine(partitionKey);
System.Diagnostics.Debug.WriteLine(userStatement);
// Methode für den Table-Eintrag wird hier ausgeführt
Task<bool> bLinkCreated = tableQueries.InsertURL(partitionKey, rowKey, userStatement);
bLinkCreated.Wait();
// 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);
}
这是输入的地方:
public class TableQueries
{
public string accountKey { get; set; }
public string accountName { get; set; }
public async Task<bool> InsertURL(string partitionKey, string rowKey, string userStatement)
{
bool bSuccess = false;
CloudStorageAccount storageAccount = new CloudStorageAccount(new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(accountName, accountKey), true);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable linkTable = tableClient.GetTableReference(accountName);
// linkTable.CreateIfNotExists();
await linkTable.CreateIfNotExistsAsync();
// Erstelle eine neue Entität
LinkEntity link = new LinkEntity(partitionKey, rowKey);
// Füge im neuen Table-Eintrag die Nachricht des Benutzers hinzu
link.userStatement = userStatement;
// Create the TableOperation that inserts the customer entity.
TableOperation insertOperation = TableOperation.InsertOrMerge(link);
try
{
await linkTable.ExecuteAsync(insertOperation);
bSuccess = true;
}
catch (Exception e)
{
bSuccess = false;
}
return bSuccess;
}
}
LinkEntry.cs:
public class LinkEntity : TableEntity
{
public LinkEntity(string partitionKey, string rowKey)
{
PartitionKey = partitionKey;
RowKey = rowKey;
}
public LinkEntity() { }
public string userStatement { get; set; }
}
LinkSummary.cs
public class LinkSummary
{
public string userStatement { get; set; }
}
这是我正在使用的 Nugget 包:
一个可能的原因是 PartitionKey
或 RowKey
中有一些不正确的字符。无效字符请参考this doc。并确保您没有插入具有相同 PartitionKey
和 RowKey
的记录,这也会导致错误。
你还应该检查评论中提到的异常,它可以获得查找根本原因的详细信息。
顺便说一下,您使用的包 WindowsAzure.Storage
真的很旧。如果可能,您应该使用最新的包 Microsoft.Azure.Cosmos.Table 用于 azure table 存储。