2014-10-20 19 views
5

Tôi đang sử dụng phiên bản 4.3.0 của thư viện Lưu trữ Windows Azure cho .NET. Trong lớp kho ATS của tôi, tôi có một vài đợt xóa các phương pháp mà trông như thế này:"Mã phản hồi không mong muốn cho hoạt động: 0" khi thực thi lô lưu trữ bảng Azure xóa

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); 
} 

Ở những nơi khác trong mã của tôi, rằng DeleteAsync() phương pháp hoạt động chính xác. Tuy nhiên, ở một nơi đặc biệt, tôi nhận được thông báo lỗi này khi thực hiện đợt:

Unexpected Response Code for Operation: 0 

Dưới đây là các trang web gọi:

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; 
    } 
} 

Phương pháp UpsertAsync() trên thành công, nhưng DeleteAsync() thất bại. Lưu ý rằng nó không xóa chính xác các thực thể tương tự mà FindByPartitionRowAsync() được truy xuất từ ​​bảng, vì vậy tôi không thể tưởng tượng nó có thể liên quan gì đến các thực thể không đúng định dạng hoặc bất kỳ thứ gì của ilk đó.

Dưới đây là một ví dụ về một trong những "toDelete" đối tượng (ở định dạng 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 lưu trữ các thông báo lỗi có tiếng và ngoạn mục vô ích, và Googling đã trở gì về hàng loạt delete thất bại với đặc biệt này lỗi.

Điều này không thành công khi sử dụng bộ nhớ phát triển cục bộ và trong sản xuất.

Mọi suy nghĩ?

+0

Xin chào Ken, bạn có nhớ chia sẻ mã .ForEachParallel() và .ToSegmentedList() của bạn không, nó trông rất tiện dụng. Cám ơn. –

+0

Chắc chắn. Xem https://gist.github.com/smithkl42/ca5b98e909952eddef1e3a076c0dd91d và https://gist.github.com/smithkl42/36ca70a63fe1a3bbf2d03a4d0bbe46c2. –

Trả lời

21

'Mã phản hồi không mong muốn cho hoạt động: 0' về cơ bản có nghĩa là thao tác đầu tiên trong lô bị lỗi. Chỉ số của hoạt động không thành công được trả về trong lỗi được ném sao cho nó dễ dàng hơn cho người dùng truy cập và thay đổi hoạt động cụ thể trong lô không thành công.

Bạn có thể tìm thêm thông tin về yêu cầu rằng thất bại và lỗi bằng cách bắt StorageException và kiểm tra:

  • exception.RequestInformation.HttpStatusCode
  • exception.RequestInformation.ExtendedErrorInformation.ErrorCode
  • exception.RequestInformation.ExtendedErrorInformation.ErrorMessage

Các thông tin này cũng là có sẵn trong kết quả cuối cùng của OperationContext nếu bạn sử dụng một OperationContext để theo dõi yêu cầu và sử dụng phù hợp với tôi thod quá tải mà mất trong OperationContext.

Chúng tôi sẽ xem xét việc thay đổi thông báo lỗi trong tương lai để nó ít khó hiểu hơn. Cảm ơn vì bạn đã phản hồi!

0

trong trường hợp của tôi, nó đã được giải quyết cho lỗi. 'Microsoft.WindowsAzure.Storage.StorageException: 'Yếu tố 0 trong đợt trả lại một mã phản hồi bất ngờ'

đoạn mã

bảng.CreateIfNotExists();

Mã Main

CloudStorageAccount SA = CloudStorageAccount.Parse (CloudConfigurationManager.GetSetting ("SC"));

CloudTableClient tableClient = SA.CreateCloudTableClient();

Bảng CloudTable = tableClient.GetTableReference ("myWorld");

table.CreateIfNotExists();

TableBatchOperation batchOperation = new TableBatchOperation();

batchOperation.Insert (object);

table.ExecuteBatch (batchOperation);

Các vấn đề liên quan