2014-10-20 10 views
5

Używam wersji 4.3.0 bibliotek magazynu Windows Azure dla .NET. W moim ATS klasy repozytorium, mam kilka partii usuwać metod, które wyglądają tak:"Nieoczekiwany kod odpowiedzi dla operacji: 0" podczas wykonywania usuwania wsadowego tabeli Azure Table

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

w innych miejscach w moim kodu, który DeleteAsync() metoda działa poprawnie. Jednak w jednym konkretnym miejscu, otrzymuję komunikat o błędzie podczas wykonywania partii:

Unexpected Response Code for Operation: 0 

Oto strona wezwanie:

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

Sposób UpsertAsync() powyżej powiedzie, ale DeleteAsync() zawiedzie. Zauważ, że nie usuwa dokładnie tych samych obiektów, które zostały pobrane z tabeli, więc nie mogę sobie wyobrazić, jak może to mieć coś wspólnego ze zniekształconymi obiektami lub czymkolwiek w tym rodzaju.

Oto przykład jednego z obiektów „toDelete” (w formacie 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'\\"" 
} 

komunikaty o błędach Azure Storage są notorycznie i spektakularnie nieprzydatny i Googling powrócił nic o partii usuwa niepowodzeniem z tym konkretnym błąd.

Nie powiedzie się to zarówno podczas korzystania z lokalnego oprogramowania do programowania, jak i podczas produkcji.

Jakieś myśli?

+0

Witam, Ken, czy mógłbybyś podzielić się swoimi znakami .ForEachParallel() i .ToSegmentedList(), to jest coś, co wygląda na bardzo przydatne. Dzięki. –

+0

Pewnie. Zobacz https://gist.github.com/smithkl42/ca5b98e909952eddef1e3a076c0dd91d i https://gist.github.com/smithkl42/36ca70a63fe1a3bbf2d03a4d0bbe46c2. –

Odpowiedz

21

"Niespodziewany kod odpowiedzi operacji: 0" oznacza w zasadzie, że pierwsza operacja wsadowa nie powiodła się. Indeks nieudanej operacji jest zwracany w zgłoszonym błędzie, co ułatwia użytkownikom przejście i zmianę określonej operacji w grupie, która się nie powiodła.

można uzyskać więcej informacji na temat wniosku, że nie powiodło się i błędu łapanie StorageException i sprawdziany:

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

Ta sama informacja jest również dostępne w ostatnim wyniku OperationContext, jeśli użyjesz OperationContext do śledzenia żądania i użycia odpowiedniego mnie te przeciążenia, które przyjmują operację Kontekst.

Spójrzmy na zmianę komunikatu o błędzie w przyszłości, aby było mniej kłopotliwe. Dzięki za opinie!

0

w moim przypadku został rozwiązany z powodu błędu. 'Microsoft.WindowsAzure.Storage.StorageException: 'element 0 w partii zwrócony nieoczekiwany kod odpowiedzi'

fragment kodu

tabeli.CreateIfNotExists();

Kod Główna

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

CloudTableClient tableClient = SA.CreateCloudTableClient();

Tabela CloudTable = tableClient.GetTableReference ("myWorld");

table.CreateIfNotExists();

TableBatchOperation batchOperation = new TableBatchOperation();

batchOperation.Insert (obiekt);

table.ExecuteBatch (batchOperation);

Powiązane problemy