我正在运行一些使用Azure CloudQueue的测试,而在设置/拆解时,我正在调用CreateIfNotExistsAsync()和DeleteIfExistsAsync()。但是当我连续运行我的测试时,我得到了一个Microsoft.WindowsAzure.Storage.StorageException,“远程服务器返回了一个错误:(409)冲突。”
await cloudQueue.CreateIfNotExistsAsync();
// do work 1
await cloudQueue.DeleteIfExistsAsync();
await cloudQueue.CreateIfNotExistsAsync(); // throws exception
// do work 2
在仔细查看服务器的响应后,我发现StatusDescription说“正在删除指定的队列。”
是否有一个我可以调用的方法,一旦它返回,我确定队列已经被删除了?
=============================================== ========================== 更新现在我想起来了。如果Azure Queue服务器想要回复删除结果,它将必须跟踪未完成的传入请求,这显然是不好的设计(易受DOS攻击)......
答案 0 :(得分:1)
是否有一种我可以调用的方法,一旦它返回,我知道 确定队列已被删除?
不幸的是没有。删除队列(或blob容器/表/文件共享)是一种异步操作。当您发送删除队列的请求时,Azure存储会将该队列标记为删除(以便不能对其执行任何操作),然后通过后台进程实际删除队列。根据文档,删除队列最多可能需要30秒。但是,它可能更多地取决于那里保存了多少数据。
成功删除队列后,会立即标记队列 删除,客户无法访问。队列是 后来在垃圾收集过程中从队列服务中删除了。
可能的解决方法:
由于没有可以调用的方法会告诉您确定队列已被删除,您需要做的是尝试使用CreateIfNotExistsAsync
创建队列并捕获任何错误。如果HTTP状态代码为Conflict (409)
且错误代码为QueueBeingDeleted
,则应等待一段时间并重试该操作。如果需要,可以在重试之间增加延迟。