Создавайте очередь в очереди azure только в том случае, если очередь недоступна с помощью rest API

#azure #api #rest #azure-storage #azure-storage-queues

Вопрос:

Я хочу создать очередь только в том случае, если очередь недоступна в хранилище Azure. Я использую этот метод PutMessage для создания сообщения в очереди. Этот метод работает нормально, но проблема со мной в том, что мне нужно прикрепить метод createQueue.

Мой метод createqueue также работает нормально, но я не могу определить, куда нужно добавить, потому что, когда PutMessage вызывает request.GetResponse (), он генерирует ошибку, если очередь неправильная. Спасибо

 public static void PutMessage(String queueName, String message)
        {
            String requestMethod = "POST";

            String urlPath = $"{queueName}/messages";

            String storageServiceVersion = "2017-11-09";
            String dateInRfc1123Format = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);

            String messageText = $"<QueueMessage><MessageText>{message}</MessageText></QueueMessage>";
            UTF8Encoding utf8Encoding = new UTF8Encoding();
            Byte[] messageContent = utf8Encoding.GetBytes(messageText);
            Int32 messageLength = messageContent.Length;

            String canonicalizedHeaders = String.Format(
                    "x-ms-date:{0}nx-ms-version:{1}",
                    dateInRfc1123Format,
                    storageServiceVersion);
            String canonicalizedResource = $"/{StorageAccountName}/{urlPath}";
            String stringToSign = $"{requestMethod}nnn{messageLength}nnnnnnnnn{canonicalizedHeaders}n{canonicalizedResource}";
                    
            String authorizationHeader = CreateAuthorizationHeader(stringToSign);

            Uri uri = new Uri("https://"   StorageAccountName   ".queue.Azure.com/"   urlPath);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = requestMethod;
            request.Headers.Add("x-ms-date", dateInRfc1123Format);

            request.Headers.Add("x-ms-version", storageServiceVersion);

            request.Headers.Add("Authorization", authorizationHeader);
            request.ContentLength = messageLength;

            using (Stream requestStream = request.GetRequestStream())
            {
                requestStream.Write(messageContent, 0, messageLength);
            }

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                String requestId = response.Headers["x-ms-request-id"];
            }
        }
 

Комментарии:

1. Если я правильно понимаю ваш вопрос, вас беспокоит, когда вы должны вызывать свой метод создания очереди. Я прав?

2. Да, именно проблема в том, что мы решим на основе сообщения, если очередь не найдена, то сначала нужно создать очередь в очереди azure, а затем добавить сообщение.

3. Возможно ли это с помощью вызова rest api?

4. Пожалуйста, посмотрите мой ответ ниже.

Ответ №1:

Вы можете поместить следующий код в блок try/catch и проверить WebException его .

 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    String requestId = response.Headers["x-ms-request-id"];
}
 

Если очередь не существует, то вы получите сообщение об ошибке со 404 (Not Found) статусом ответа. В этом случае вы должны попытаться создать очередь, и как только вы получите успешный ответ, вам следует снова позвонить в сообщение put.

Ваш код будет выглядеть примерно так:

 
try
{
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        String requestId = response.Headers["x-ms-request-id"];
    }
}
catch (WebException exception)
{
    HttpWebResponse response = (HttpWebResponse) exception.Response;
    if (response.StatusCode == HttpStatusCode.NotFound)
    {
        //Call your create queue method here...
        CreateQueue(queueName);
        //Once the operation is successful, call PutMessage again.
        PutMessage(queueName, message);
    }
    else 
    {
        throw;
    }
}
 

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