删除和重新创建Windows Azure存储表的正确方法=错误409冲突 - 代码:TableBeingDeleted

Kra*_*r00 17 c# azure azure-storage azure-web-roles azure-table-storage

我是Windows Azure开发的新手,并且需要在Windows Azure存储表中存储一些数据.

该表实际上仅用于为位于azure存储驱动器上的某些文件提供快速查找机制.

因此,我计划在应用程序启动时填充此表(即在Web应用程序全局应用程序启动时)

而不是尝试维护此表以更改应用程序未运行时驱动器可能发生的更改.或者因为这个驱动器只是一个资源的vhd,我们可能偶尔上传一个新的vhd.

因此,而不是试图维持这一点的麻烦.在每次应用程序启动时重建此表就足够了.

我开始组合一些代码来检查表是否已经存在,如果它确实删除它,然后重新创建一个新表.

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

我曾预料到这不起作用.我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?是否有一个事件可以订阅,以便在表被删除时通知您?有关实施此方法的最佳方法的其他建议吗?

Ing*_*ahn 28

来自MSDN:"请注意,删除表可能需要至少40秒才能完成.如果在删除表时尝试对该表执行操作,则该服务将返回状态代码409(冲突),并显示指示该表的其他错误信息该表正在删除."

解决此问题的唯一方法是创建一个具有不同名称的表.这可以像为您的名称附加时间戳或GUID一样简单.小心清理你的垃圾.

  • 根据桌子的大小和许多其他因素,这可能需要很长时间. (3认同)
  • 这对于拆除并重新创建 dbs 等的自动化环境脚本来说是一种痛苦。可能只需要在其间等待一段时间就可以继续尝试,直到它工作为止。 (2认同)

huh*_*uha 15

如果需要使用相同的表名,可以使用扩展方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

警告!使用此方法时要小心,因为它会阻塞线程.如果第三方服务(Azure)不断产生这些错误,它可以进入死循环.原因可能是表锁定,订阅到期,服务不可用等.

  • 哇,这不是一个好主意.通常我会尽量避免在逻辑依赖于第三方服务时(true).而(retryCnt> 0)在这里会更好. (4认同)