2013-08-02 88 views
1

我有一个关于Windows Azure存储队列错误/访问的非常基本的问题。检查队列是否存在

我想知道给定的存储帐户是否已经包含一个给定名称的队列 - 比如说“queue1”。如果队列不存在,我不想创建队列,所以我不喜欢使用CreateIfNotExist方法。我给SAS令牌的权限是 - 处理和添加(因为我想要做的只是在队列上添加一条新消息,只有它已经存在,否则抛出错误)

问题是当我试图获得一个虚假的命名队列的引用并向它添加一条消息时,我得到了一个403.当SAS令牌没有权限时也会发生403,所以我不能确定是什么导致了错误。

有没有一种方法可以明确地知道队列是否存在?

我已经尝试了BeginExist和EndExist方法,但即使当我看到队列在那里时,它们也总是返回false。

有什么建议吗?

回答

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

如果队列存在或Queue Service Error Code否则Get Queue Metadata REST API操作将返回的状态代码200。

关于到授权,

This operation can be performed by the account owner and by anyone with a shared access signature that has permission to perform this operation.

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