我正在尝试使用REST API更新Azure Service Bus订阅。
当我在请求XML中包含"ForwardTo"
属性时,我从服务总线收到Authorization Failure (401)
错误。
这是我的XML请求:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<entry xmlns="http://www.w3.org/2005/Atom">
<content type="application/xml">
<SubscriptionDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect">
<LockDuration>PT1M</LockDuration>
<RequiresSession>false</RequiresSession>
<DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive>
<DeadLetteringOnMessageExpiration>false</DeadLetteringOnMessageExpiration>
<DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions>
<MessageCount>1</MessageCount>
<MaxDeliveryCount>10</MaxDeliveryCount>
<EnableBatchedOperations>true</EnableBatchedOperations>
<Status>Active</Status>
<ForwardTo>sb://namespacename.servicebus.windows.net/t200</ForwardTo>
<CreatedAt>2017-08-14T16:17:15.308721Z</CreatedAt>
<UpdatedAt>2017-08-16T15:33:03.0317963Z</UpdatedAt>
<AccessedAt>2017-08-16T11:29:37.993Z</AccessedAt>
<AutoDeleteOnIdle>P10675199DT2H48M5.4775807S</AutoDeleteOnIdle>
</SubscriptionDescription>
</content>
</entry>
但是,如果我删除&#34; ForwardTo&#34;来自请求XML的节点,一切都很好。
我也查看了Service Bus REST API文档,遗憾的是文档非常不完整。它没有提供关于如何制作XML请求有效负载的任何示例。
我甚至查看了其他SDK(例如Python),还有很多属性被忽略了:(。
有趣的是,我通过Service Bus Explorer(使用.Net SDK)执行了相同的操作,操作正常。我使用HTTP协议连接到我的Service Bus帐户,并通过Fiddler跟踪请求/响应,我的请求和Service Bus Explorer发送的请求大致相同(它发送了一些额外的参数,我在请求中没有包含这些参数) )。
此外,Service Bus没有向我提供有关错误的更多详细信息。我从那里得到的只有:
{
"statusCode": 401,
"baseError": null,
"headers": {
"transfer-encoding": "chunked",
"content-type": "application/xml; charset=utf-8",
"server": "Microsoft-HTTPAPI/2.0",
"strict-transport-security": "max-age=31536000",
"date": "Wed, 16 Aug 2017 15:41:33 GMT",
"connection": "close"
}
}
我在这里完全失去了可能导致此错误的原因。
我知道Service Bus REST API对于XML元素应该出现在请求体中的顺序非常挑剔,据我所知,排序是正确的(但是我可能会错,因为我没有&#39 ; t有任何参考文件来比较我的请求机构。)
当我改变&#34; ForwardTo&#34;的顺序时节点,我没有收到任何错误,但是忽略了这个属性(因为请求体中XML元素的顺序)。
对此的任何见解都将受到高度赞赏。
答案 0 :(得分:0)
在Azure Service Bus产品团队的帮助下,我能够解决此问题。
基本上,请求需要包含2个额外的标头:ServiceBusSupplementaryAuthorization
和ServiceBusDlqSupplementaryAuthorization
。如果为队列设置了ForwardTo
属性,则需要第一个标头。如果为队列设置了ForwardDeadLetteredMessagesTo
属性,则需要第二个标头。如果未在队列中设置这些属性,则不应存在这些标头。
这些授权标头的计算方式与常规请求授权标头的计算方式略有不同。计算这些请求标头所需的网址分别是ForwardTo
和ForwardDeadLetteredMessagesTo
标头的ServiceBusSupplementaryAuthorization
和ServiceBusDlqSupplementaryAuthorization
属性值。