Правильный способ удаления и воссоздания таблицы WIndows Azure Storage = Ошибка 409 Конфликт - Код: TableBeingDeleted - программирование

Правильный способ удаления и воссоздания таблицы WIndows Azure Storage = Ошибка 409 Конфликт - Код: TableBeingDeleted

Im действительно новичок в разработке Windows Azure и требует хранения некоторых данных в таблице хранения azure в Windows.

Эта таблица будет действительно существовать только для того, чтобы обеспечить быстрый механизм поиска для некоторых файлов, расположенных на лазурном диске.

Поэтому я планировал заполнять эту таблицу при запуске приложения (т.е. запускать глобальное приложение веб-приложения)

Вместо того, чтобы пытаться сохранить эту таблицу для изменений, изменения, которые могут произойти на диске, пока приложение не запущено. Или, поскольку этот диск является всего лишь VHD ресурсов, мы можем иногда загружать новый VHD.

Итак, вместо того, чтобы пытаться сохранить это. достаточно, чтобы эта таблица была восстановлена ​​при каждом запуске приложения.

Я начал собирать некоторый код, чтобы проверить, существует ли таблица, и если она удаляет ее, а затем воссоздает новую таблицу.

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

Я ожидал, что это не сработает. И я получаю следующую ошибку:

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

Каков правильный способ сделать это? Есть ли событие, на которое можно подписаться, чтобы сообщить вам, когда таблица была удалена? Другие предложения по наилучшему способу реализации этого?

4b9b3361

Ответ 1

Из MSDN: "Обратите внимание, что для удаления таблицы, вероятно, потребуется не менее 40 секунд. Если операция выполняется против таблицы, пока она была удаляется, служба возвращает код состояния 409 (конфликт), с дополнительной информацией об ошибке, указывающей, что таблица удаляется."

Единственный способ справиться с этим - создать таблицу с другим именем. Это может быть так же просто, как добавить к вашему имени временную метку или идентификатор GUID. Просто будьте осторожны, чтобы очистить ваш мусор.

Ответ 2

Если вам нужно использовать одно и то же имя таблицы, вы можете использовать метод расширения:

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

ВНИМАНИЕ! Будьте осторожны, когда вы используете этот подход, потому что он блокирует поток. И он может перейти в мертвый цикл, если сторонняя служба (Azure) продолжает генерировать эти ошибки. Причиной этого может быть блокировка таблиц, срок действия подписки, недоступность службы и т.д.