"意外的操作响应代码:0"执行Azure表存储批量删除时

时间:2014-10-20 18:11:09

标签: c# azure-storage

我正在使用适用于.NET的Windows Azure存储库4.3.0版。在我的ATS存储库类中,我有几个批处理删除方法,如下所示:

public async Task DeleteAsync(IEnumerable<T> entities)
{
    await ExecuteAsBatch(entities, (batch, entity) => batch.Delete(entity));
}

private async Task ExecuteAsBatch(IEnumerable<T> entities, Action<TableBatchOperation, T> batchAction)
{
    var byPartition = entities.GroupBy(x => x.PartitionKey).ToList();

    await byPartition.ForEachParallel(async group =>
    {
        // A maximum of 100 actions are allowed per batch job
        var segments = group.ToList().ToSegmentedList(100);
        await segments.ForEachParallel(async segment =>
        {
            var batch = new TableBatchOperation();
            foreach (var entity in segment)
            {
                batchAction(batch, entity);
            }
            await Table.ExecuteBatchAsync(batch);
        }, 10);
    }, 10);
}

在我的代码中的其他位置,DeleteAsync()方法正常工作。但是,在一个特定的地方,我在执行批处理时收到此错误消息:

Unexpected Response Code for Operation: 0

这是通话网站:

private async Task MergeAtsOrganizationUserEvents(int organizationId, IEnumerable<CustomerUserEvent> fromEvents, CustomerUser to)
{
    var toDelete = (await fromEvents.SelectParallel(async fromEvent =>
    {
        var pkey = AtsOrganizationUserEventByMinute.GetPartitionKey(organizationId, fromEvent.OccurredOn);
        var rkey = AtsOrganizationUserEventByMinute.GetRowKey(fromEvent.OccurredOn, fromEvent.CustomerUserEventId);
        return await Ats.OrganizationUserEventByMinute.FindByPartitionRowAsync(pkey, rkey);
    })).Where(x => x != null).ToList();

    var toInsert = toDelete
        .Select(x => AtsOrganizationUserEventByMinute.FromBase(x.OrganizationId, x.OccurredOn, x.CookieId,
            to.CustomerUserId, x))
        .ToList();

    try
    {
        await Ats.OrganizationUserEventByMinute.UpsertAsync(toInsert);
        await Ats.OrganizationUserEventByMinute.DeleteAsync(toDelete);
    }
    catch (Exception ex)
    {
        _logger.Error("Unable to merge {0} AtsOrganizationEvents for org {1}, to customer user {2}: {3}",
            toInsert.Count, organizationId, to.CustomerUserId, ex.CompleteMessage());
        throw;
    }
}

上面的UpsertAsync()方法成功,但DeleteAsync()失败。请注意,它无法精确删除FindByPartitionRowAsync()从表中检索到的相同实体,因此我无法想象它是如何与格式错误的实体或任何类似的实体有关。

以下是其中一个“toDelete”对象(采用JSON格式)的示例:

{  
   "CookieId":null,
   "CustomerUserId":185766,
   "CustomerUserEventId":3568687,
   "OrganizationId":4190,
   "EventName":"event1",
   "SessionId":null,
   "OccurredOn":"2014-10-20T18:17:09.9971379Z",
   "UrlId":null,
   "Url":null,
   "ReferrerUrlId":null,
   "ReferrerUrl":null,
   "IsSynthetic":false,
   "IpAddress":null,
   "PartitionKey":"4190.2014.10.20",
   "RowKey":"18.17.3568687",
   "Timestamp":"2014-10-20T18:17:11.237+00:00",
   "ETag":"W/\\"   datetime'2014-10-20T18%3A17%3A11.237Z'\\""
}

Azure存储错误消息是众所周知且非常无益的,并且谷歌搜索没有返回任何关于因此特定错误而失败的批量删除。

使用本地开发存储和生产时都会失败。

有什么想法吗?

3 个答案:

答案 0 :(得分:26)

'意外的操作响应代码:0'基本上意味着批处理中的第一个操作失败。在抛出的错误中返回失败操作的索引,这样用户就可以更轻松地更改失败批处理中的特定操作。

您可以通过捕获StorageException并检查:

来获取有关失败请求和错误的更多信息
  • exception.RequestInformation.HttpStatusCode
  • exception.RequestInformation.ExtendedErrorInformation.ErrorCode
  • exception.RequestInformation.ExtendedErrorInformation.ErrorMessage

如果使用OperationContext跟踪请求并使用接收OperationContext的合适方法重载,则OperationContext的最后结果中也提供相同的信息。

我们将在未来更改错误消息,以免混淆。感谢您的反馈!

答案 1 :(得分:0)

在我的情况下,它已得到解决的错误。 &#39; Microsoft.WindowsAzure.Storage.StorageException:&#39;批次中的元素0返回了意外的响应代码&#39;

代码段

table.CreateIfNotExists();

主要代码

CloudStorageAccount SA = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting(&#34; SC&#34;));

CloudTableClient tableClient = SA.CreateCloudTableClient();

CloudTable table = tableClient.GetTableReference(&#34; myWorld&#34;);

table.CreateIfNotExists();

TableBatchOperation batchOperation = new TableBatchOperation();

batchOperation.Insert(对象);

table.ExecuteBatch(batchOperation);

答案 2 :(得分:0)

另一个原因是在关键字段中使用了无效字符。如果您正在搜索此错误消息,则可能会错过以下答案:

Azure Table Storage RowKey restricted Character Patterns?

  

关键字段中不允许使用的字符   PartitionKey和RowKey属性的值中不允许使用以下字符:

     

正斜杠(/)字符

     

反斜杠()字符

     

数字符号(#)

     

问号(?)字符

     

从U + 0000到U + 001F的控制字符,包括:

     

水平制表符(\ t)字符

     

换行(\ n)字符

     

回车符(\ r)

     

从U + 007F到U + 009F的控制字符