#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;
}
}
Пожалуйста, обратите внимание, что вы также можете получить другие исключения, однако в контексте этой операции мы не будем пытаться их обработать, а просто отменим эти исключения.