0

我正在尝试使用 REST API 更新 Azure 服务总线订阅。

当我"ForwardTo"在请求 XML 中包含属性时,我收到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>

但是,如果我从请求 XML 中删除“ForwardTo”节点,一切正常。

我还查看了 Service Bus REST API 文档,不幸的是,该文档非常不完整。它没有提供任何关于如何制作 XML 请求有效负载的示例。

我什至查看了其他 SDK(例如 Python),也有很多属性被方便地忽略了:(。

有趣的是,我通过服务总线资源管理器(使用 .Net SDK)执行了相同的操作,并且操作正常。我使用 HTTP 协议连接到我的 Service Bus 帐户并通过 Fiddler 跟踪请求/响应,我的请求和 Service Bus Explorer 发送的请求或多或少相同(它发送了一些我没有包含在我的请求中的额外参数)。

此外,服务总线没有向我提供有关该错误的更多详细信息。我从那里得到的唯一东西是:

{
    "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"
    }
}

对于可能导致此错误的原因,我在这里完全不知所措。

我确实知道服务总线 REST API 对 XML 元素应该出现在请求正文中的顺序非常挑剔,据我所知,顺序是正确的(但我可能又错了,因为我没有任何参考文件来比较我的请求正文)。

当我更改“ForwardTo”节点的顺序时,我没有收到任何错误,但随后此属性被忽略(因为请求正文中 XML 元素的顺序)。

对此的任何见解将不胜感激。

4

1 回答 1

0

在 Azure 服务总线产品团队的帮助下,我能够解决这个问题。

本质上,请求需要包含 2 个额外的标头:ServiceBusSupplementaryAuthorizationServiceBusDlqSupplementaryAuthorization. ForwardTo如果为队列设置了属性,则需要第一个标头。ForwardDeadLetteredMessagesTo如果为队列设置了属性,则需要第二个标头。如果未在队列中设置这些属性,则不应存在这些标头。

这些授权标头的计算方式与您的常规请求授权标头相同,但有一点不同。计算这些请求标头所需的 URL分别是和headers 的值ForwardToForwardDeadLetteredMessagesTo属性。ServiceBusSupplementaryAuthorizationServiceBusDlqSupplementaryAuthorization

于 2017-08-22T05:57:59.337 回答