在 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

一个可能的原因是 PartitionKeyRowKey 中有一些不正确的字符。无效字符请参考this doc。并确保您没有插入具有相同 PartitionKeyRowKey 的记录,这也会导致错误。

你还应该检查评论中提到的异常,它可以获得查找根本原因的详细信息。

顺便说一下,您使用的包 WindowsAzure.Storage 真的很旧。如果可能,您应该使用最新的包 Microsoft.Azure.Cosmos.Table 用于 azure table 存储。