【问题标题】:Create queue in azure queue only if queue not available using rest API仅当队列不可用时使用 REST API 在 azure 队列中创建队列
【发布时间】:2021-11-20 08:46:05
【问题描述】:

仅当队列在 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"];
            }
        }

【问题讨论】:

  • 如果我正确理解您的问题,您会担心何时应该调用创建队列方法。我说的对吗?
  • 是的,问题是如果找不到队列,我们​​将根据消息来决定,然后需要在添加消息后首先在 azure 队列上创建队列。
  • 使用rest api调用是否可行?
  • 请看下面我的回答。

标签: azure api rest azure-storage azure-storage-queues


【解决方案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;
    }
}

请注意,您也可以得到其他异常,但是在此操作的上下文中,我们不会尝试处理它们而只是重新抛出这些异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2010-09-11
    • 2011-06-09
    • 1970-01-01
    • 2016-07-19
    • 2013-02-13
    相关资源
    最近更新 更多