tables tablas microsoft cuenta common almacenamiento c# azure azure-storage azure-table-storage azure-web-roles

c# - tablas - La forma correcta de eliminar y recrear una tabla de almacenamiento de Windows Azvert=Error 409 Conflicto-Código: TableBeingDeleted



tablas azure (2)

Desde MSDN : "Tenga en cuenta que eliminar una tabla probablemente demore al menos 40 segundos en completarse. Si se intenta realizar una operación contra la tabla mientras se estaba eliminando, el servicio devuelve el código de estado 409 (Conflicto), con información adicional de error que indica la tabla está siendo eliminada ".

La única forma de lidiar con esto es crear una tabla con un nombre diferente. Esto podría ser tan simple como agregar una marca de tiempo o GUID a su nombre. Solo ten cuidado de limpiar tu basura.

Soy realmente nuevo en el desarrollo de Windows Azure y tengo el requisito de almacenar algunos datos en una tabla de almacenamiento azul de windows.

Esta tabla solo existirá para proporcionar un mecanismo de búsqueda rápida para algunos archivos que se encuentran en la unidad de almacenamiento azul.

Por lo tanto, estaba planeando rellenar esta tabla al inicio de la aplicación (es decir, en el inicio de la aplicación global de la aplicación web)

En lugar de tratar de mantener esta tabla para cambios, se pueden producir cambios en la unidad mientras la aplicación no se está ejecutando. O como este disco es solo un vhd de recursos, de vez en cuando podemos cargar un nuevo vhd.

Entonces, en lugar de la molestia de tratar de mantener esto. es suficiente que esta tabla sea reconstruida al inicio de cada aplicación.

Comencé a armar un código para verificar si la tabla ya existe, y si lo hace, y luego recrear una nueva tabla.

var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ConnectionString); var tableClient = storageAccount.CreateCloudTableClient(); var rmsTable = tableClient.GetTableReference("ResourceManagerStorage"); rmsTable.DeleteIfExists(); rmsTable.Create();

Esperaba que esto no funcionara. Y obtengo el siguiente error:

The remote server returned an error: (409) Conflict. HTTP/1.1 409 Conflict Cache-Control: no-cache Transfer-Encoding: chunked Server: Windows-Azure-Table/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: c6baf92e-de47-4a6d-82b3-4faec637a98c x-ms-version: 2012-02-12 Date: Tue, 19 Mar 2013 17:26:25 GMT 166 <?xml version="1.0" encoding="utf-8" standalone="yes"?> <error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> <code>TableBeingDeleted</code> <message xml:lang="en-US">The specified table is being deleted. Try operation later. RequestId:c6baf92e-de47-4a6d-82b3-4faec637a98c Time:2013-03-19T17:26:26.2612698Z</message> </error> 0

¿Cuál es la forma correcta de hacer esto? ¿Hay algún evento al que pueda suscribirse para avisarle cuándo se borró la tabla? ¿Alguna otra sugerencia sobre la mejor manera de implementar esto?


Si necesita usar el mismo nombre de tabla, puede usar un método de extensión:

public static class StorageExtensions { public static bool SafeCreateIfNotExists(this CloudTable table, TableRequestOptions requestOptions = null, OperationContext operationContext = null) { do { try { return table.CreateIfNotExists(requestOptions, operationContext); } catch (StorageException e) { if ((e.RequestInformation.HttpStatusCode == 409) && (e.RequestInformation.ExtendedErrorInformation.ErrorCode.Equals(TableErrorCodeStrings.TableBeingDeleted))) Thread.Sleep(1000);// The table is currently being deleted. Try again until it works. else throw; } } while (true); } }

¡ADVERTENCIA! Tenga cuidado cuando use este enfoque, ya que bloquea el hilo. Y puede ir al lazo muerto si el servicio de terceros (Azure) sigue generando estos errores. El motivo de esto podría ser el bloqueo de la tabla, el vencimiento de la suscripción, la falta de disponibilidad del servicio, etc.