通过REST将msg发送到Azure服务总线

use*_*942 7 rest azure azure-servicebus-queues

Azure队列暴露给REST API.使REST调用有效.我在POSTMAN上运行了一个示例测试.POST电话

https://yournamespace.servicebus.windows.net/yourentity/messages
Run Code Online (Sandbox Code Playgroud)

此外,传递低于2个标题和值.

标题1:

Authorization: SharedAccessSignature sr=https%3A%2F%2F.servicebus.windows.net%2Fyourentity&sig=yoursignature from code above&se=1529928563&skn=KeyName
Run Code Online (Sandbox Code Playgroud)

例:

SharedAccessSignature sr=https%3A%2F%2Fservicebussoatest1.servicebus.windows.net%2Fpublishque&sig=a0wmRklbCGFCYoSCViij9gagtZV9Bg+vU=&se=1529928563&skn=testpolicy
Run Code Online (Sandbox Code Playgroud)

标题2:

Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

但即使我已通过正确的授权值,我收到以下错误:

401:无效的授权令牌签名

Tom*_*SFT 11

401:无效的授权令牌签名

根据401错误含义,令牌不是vaild.

首先,请确保您的政策有权发送邮件.

其次,如果要使用azure服务总线Send Message Rest APi.格式应该遵循.

POST https://<yournamespace>.servicebus.windows.net/<yourentity>/messages
Authorization: SharedAccessSignature sr=https%3A%2F%2F<yournamespace>.servicebus.windows.net%2F<yourentity>&sig=<yoursignature from code above>&se=1438205742&skn=KeyName
ContentType: application/atom+xml;type=entry;charset=utf-8
Run Code Online (Sandbox Code Playgroud)

我们还可以从本文获得有关使用共享访问签名的Service Bus访问控制的更多信息.

我也跟邮递员做了一个演示.它在我身边正常工作.

我使用以下代码来获取SAS令牌.

public static string GetSasToken(string resourceUri, string keyName, string key, TimeSpan ttl)
{
      var expiry = GetExpiry(ttl);
      string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;
      HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
      var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
      var sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
      HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName);
      return sasToken;
}

private static string GetExpiry(TimeSpan ttl)
{
    TimeSpan expirySinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1) + ttl;
    return Convert.ToString((int)expirySinceEpoch.TotalSeconds);
}
string queueUrl = "https://tomtestsb.servicebus.windows.net/" + "queue" + "/messages";
string token = GetSasToken(queueUrl,"Key", "value", TimeSpan.FromDays(1));
Run Code Online (Sandbox Code Playgroud)

我们可以通过Azure门户获得关键和价值

在此输入图像描述

用邮递员测试一下.

头:

Authorization:SharedAccessSignature sr=https%3a%2f%2fyournamespace.servicebus.windows.net%2fqueuename%2fmessages&sig=SyumAUNnqWFjW2MqjwlomU%2fbblqZljq6LPJp3jpfU%2b4%3d&se=1529478623&skn=KeyName

Content-Type?application/xml
Run Code Online (Sandbox Code Playgroud)

身体

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">This is a message.</string> 
Run Code Online (Sandbox Code Playgroud)

测试结果:

在此输入图像描述

  • 注意:当我尝试在队列上使用共享访问策略时,它会因授权令牌错误而失败,但是如果我在服务总线命名空间上使用共享访问策略,它会起作用。 (2认同)