azure - 仅当队列不可用时使用 REST API 在 azure 队列中创建队列
问题描述
只有当队列在 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}\n\n\n{messageLength}\n\n\n\n\n\n\n\n\n{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"];
}
}
解决方案
您可以将以下代码放在 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;
}
}
请注意,您也可以获得其他异常,但是在此操作的上下文中,我们不会尝试处理它们并简单地重新抛出这些异常。
推荐阅读
- clickhouse - 在 Clickhouse 集群中获取重复项
- qt - QDebug 在 Qt 4.7 中传递自定义调试消息类型
- java - 使用 derby 和 redis 制作 solr 类型的搜索引擎
- mongodb - 在mongodb中如何获得最高的薪水
- reactjs - 引用其他状态属性的 React JS 状态
- java - 从字符串生成单词列表的组合
- android - Android-Openweathermap:搜索后的城市列表
- oracle - 在大更新期间处理 Oracle ARCHIVELOG
- asp.net-web-api - 如何在.net web api中将DateTime对象作为json传递
- asp.net - 在 Plesk 上执行 exe 文件