我有一个关于Windows Azure存储队列错误/访问的非常基本的问题。
我试图找出给定的存储帐户是否已包含给定名称的队列 - 比如说“queue1”。我不想创建队列,如果它不存在,所以我不热衷于使用CreateIfNotExist方法。我给SAS令牌的权限是 - 处理和添加(因为我只想将新消息添加到队列,只有它已经存在,否则抛出错误)< / p>
问题在于,当我尝试引用伪命名队列并向其添加消息时,我得到403. 403也可能在SAS令牌没有权限时发生,所以我不能确定是什么导致错误。
有没有办法可以明确知道队列是否存在?
我尝试过BeginExist和EndExist方法,但即使我看到队列在那里,它们也总是返回false。
有什么建议吗?
答案 0 :(得分:2)
如果队列存在,Get Queue Metadata
REST API操作将返回状态代码200,否则返回Queue Service Error Code。
关于授权,
此操作可由帐户所有者和拥有执行此操作权限的共享访问签名的任何人执行。
GET请求
https://myaccount.queue.core.windows.net/myqueue?comp=metadata
将返回如下响应:
Response Status:
HTTP/1.1 200 OK
Response Headers:
Transfer-Encoding: chunked
x-ms-approximate-messages-count: 0
Date: Fri, 16 Sep 2011 01:27:38 GMT
Server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0
答案 1 :(得分:1)
即使队列不存在,您确定收到403错误吗?根据您上面描述的内容,我创建了一个简单的控制台应用程序。我的存储帐户中不存在该队列。当我尝试添加带有效SAS令牌的消息时,出现404错误:
CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("account", "key"), false);
CloudQueueClient client = storageAccount.CreateCloudQueueClient();
CloudQueue queue = client.GetQueueReference("non-existent-queue");
var queuePolicy = new SharedAccessQueuePolicy();
var sas = queue.GetSharedAccessSignature(new SharedAccessQueuePolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(30),
Permissions = SharedAccessQueuePermissions.Add | SharedAccessQueuePermissions.ProcessMessages | SharedAccessQueuePermissions.Update
}, null);
StorageCredentials creds = new StorageCredentials(sas);
var queue1 = new CloudQueue(queue.Uri, creds);
try
{
queue1.AddMessage(new CloudQueueMessage("This is a test message"));
}
catch (StorageException excep)
{
//Get 404 error here
}
接下来,我将SAS令牌设置为无效,将其设置为当前时间前30分钟。现在,当我运行应用程序时,我按预期得到了403错误。
CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("account", "key"), false);
CloudQueueClient client = storageAccount.CreateCloudQueueClient();
CloudQueue queue = client.GetQueueReference("non-existent-queue");
var queuePolicy = new SharedAccessQueuePolicy();
var sas = queue.GetSharedAccessSignature(new SharedAccessQueuePolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(-30),//-30 to ensure SAS is invalid
Permissions = SharedAccessQueuePermissions.Add | SharedAccessQueuePermissions.ProcessMessages | SharedAccessQueuePermissions.Update
}, null);
StorageCredentials creds = new StorageCredentials(sas);
var queue1 = new CloudQueue(queue.Uri, creds);
try
{
queue1.AddMessage(new CloudQueueMessage("This is a test message"));
}
catch (StorageException excep)
{
//Get 403 error here
}
答案 2 :(得分:1)
现在有一个Exists
和ExistsAsync
(带有各种重载)。
使用的前者示例:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference(queueName);
bool doesExist = queue.Exists();
您将需要引用Microsoft.Azure.Storage.Queue
(我相信较旧的'cloud'程序集可能没有这些属性-最初,我只能在引用正确的程序包之前访问ExistsAsync
还可以通过Nuget Exists
添加以上内容)
有关更多详细信息,请参见以下链接:
答案 3 :(得分:0)
Exists
中也没有v12
方法。编写了一个简单的辅助方法来进行检查:
private async Task<bool> QueueExistsAsync(QueueClient queue)
{
try
{
await queue.GetPropertiesAsync();
return true;
}
catch (RequestFailedException ex)
{
if (ex.Status == (int) HttpStatusCode.NotFound)
{
return false;
}
throw;
}
}