La forma correcta de eliminar y volver a crear una tabla de almacenamiento de Windows Azure = Error 409 Conflict – Código: TableBeingDeleted

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

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

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

En lugar de intentar mantener esta tabla para los cambios, los cambios que podrían ocurrir en la unidad mientras la aplicación no se está ejecutando. O como esta unidad es solo una vhd de recursos, es posible que en ocasiones carguemos una nueva vhd.

Así que en lugar de la molestia de tratar de mantener esto. es suficiente que esta tabla se reconstruya al iniciar cada aplicación.

Comencé a juntar algo de código para verificar si la tabla ya existe, y si la elimina, 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 me sale 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   TableBeingDeleted The specified table is being deleted. Try operation later. RequestId:c6baf92e-de47-4a6d-82b3-4faec637a98c Time:2013-03-19T17:26:26.2612698Z  0 

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

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

La única manera 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.

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 al utilizar este enfoque, ya que bloquea el hilo. Y puede ir al ciclo muerto si el servicio de terceros (Azure) sigue generando estos errores. El motivo podría ser el locking de tablas, la caducidad de la suscripción, la indisponibilidad del servicio, etc.