2017-06-28 1 views
2

Ich bin mit Azure Tabellen Speichern Informationen von meinem MVC-app einzuloggen, aber es wirft manchmal die folgende Ausnahme:Azure Tabellen Speicher Ausnahme auf Insert werfen: (409) Konflikt

[WebException: The remote server returned an error: (409) Conflict.] 
    System.Net.HttpWebRequest.GetResponse() +1399 
    Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync(RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:677 

[StorageException: The remote server returned an error: (409) Conflict.] 
    Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync(RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:604 
    Microsoft.WindowsAzure.Storage.Table.TableOperation.Execute(CloudTableClient client, CloudTable table, TableRequestOptions requestOptions, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Table\TableOperation.cs:44 

Es scheint zu passieren Wenn ich zum ersten Mal nach einer gewissen Inaktivität auf die Website klicke, wird die Seite geladen, wenn ich auf "Aktualisieren" klicke. Hier

ist der Teil des Codes, der die Ausnahme verursacht:

var visit = new TrackerVisitEntity(id, url, referer); 
    var insertOperation = TableOperation.Insert(visit); 
    _table.Execute(insertOperation); 

aktualisieren

Wie in den Kommentaren identifiziert und beide unten Antworten, das Problem ist, dass manchmal die Seite zweimal geladen wird in schneller Folge, und ich verwende eine GUID (einzigartig für den Benutzer) als Partition Schlüssel und die aktuelle datetime als Zeilenschlüssel, so dass dies doppelte Entitäten verursacht und die Ausnahme verursacht.

Obwohl Amors Antwort eingehender war, war Dogus einfache Lösung diejenige, die ich benutzte, also markierte ich seine korrekte. Danke an alle.

+1

Können Sie bitte überprüfen, ob die Entität existiert, wenn Sie diesen Fehler erhalten? –

+0

Was verwenden Sie als RowKey und PartitionKey? –

+0

Bitte überprüfen Sie, ob die Entität bereits als Gaurav existiert. –

Antwort

3

könnten Sie versuchen InsertOrReplace statt Insert 409 zu vermeiden, die Entität einzufügen wird, wenn sie die vorhandene nicht vorhanden ist und ersetzen, wenn es vorhanden ist. Der Vorbehalt dabei ist, dass eTag s nicht geprüft wird. Wenn also eine Entität mit dem gleichen Partitionsschlüssel und dem gleichen Zeilenschlüssel vorhanden ist, überschreibt sie diese unbedingt.

1

Im Azure-Tabellenspeicher fungieren der Partitionsschlüssel + der Zeilenschlüssel zusammen als Primärschlüssel für diesen Eintrag in die Tabelle. Diese Kombination muss eindeutig sein. Wenn Sie eine Zeile einfügen, deren Partitionsschlüssel und Zeilenschlüssel bereits in der Tabelle vorhanden sind. Es wird eine Konfliktausgabe (409) auslösen. Sie können es mit folgendem Code bestätigen.

Wenn die Ausnahme erneut auftritt, zeigen die Ablaufverfolgungsinformationen, ob Partitionsschlüssel und Zeilenschlüssel bereits vorhanden sind.

Sie können die detaillierte Ausnahmebedingungsnachricht auch von RequestInformation.ExtendedErrorInformation.ErrorMessage abrufen.

catch (StorageException ex) 
{ 
    Trace.TraceInformation(ex.RequestInformation.ExtendedErrorInformation.ErrorMessage); 
} 
Verwandte Themen