2013-08-02 89 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