2013-08-02 6 views
1

У меня есть очень простой вопрос об ошибках/доступе очереди Windows Azure.Проверка наличия очереди

Я пытаюсь выяснить, содержит ли данная учетная запись уже очередь с заданным именем - скажем, «queue1». Я не хочу создавать очередь, если она не существует, и поэтому я не хочу использовать метод CreateIfNotExist. Разрешения я дал маркеру SAS являются - обработка и добавление (так как все, что я хочу сделать, это добавить новое сообщение в очередь только если он уже существует, и выдаст ошибку в противном случае)

Проблема заключается в том, что когда я пытаюсь получить ссылку на поддельную именованную очередь и добавлю к ней сообщение, я получаю 403. 403 также может возникать, когда токен SAS не имеет прав доступа, поэтому я не могу быть уверен, что вызывает ошибку.

Есть ли способ, которым я мог бы точно знать, существует ли очередь или нет?

Я пробовал методы 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

Операция API Get Queue Metadata REST возвращает код состояния 200, если очередь существует или Queue Service Error Code иначе.

Что касается получения разрешения,

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 
Смежные вопросы