【问题标题】:Why does Power Query call Azure API Management backend URL?为什么 Power Query 调用 Azure API 管理后端 URL?
【发布时间】:2020-12-10 18:01:54
【问题描述】:

我有一个托管在 Azure API 管理 (APIM) 实例后面的 OData 端点的 Azure 应用服务。为了防止直接调用应用服务,它受到只有 APIM 拥有的证书的保护。

当我通过 Chrome 或 Postman 调用 APIM URL 时,它的行为符合预期。只有一个请求,没有重定向或有趣的业务,它返回 OData 根。 Here is a Fiddler log of a request to the APIM using Postman

但是,当使用 OData.Feed() 在 Power Query 中使用与 OData 源相同的 URL 时,它会返回一个 301 转发到后端 URL,这显然会失败,因为该 URL 受证书保护。 Here is a Fiddler log of a request to the APIM using Power Query in Excel

我已将订阅密钥配置为在标头中传递,但我也尝试将其作为查询参数,但它在 Power Query 中都不起作用。我也尝试过直接使用 OData 实体端点(以避免 $metadata 调用),但没有成功。

Power Query 使用的用户代理是 Microsoft.Data.Mashup,但我没有找到任何关于它与 APIM 兼容性的文档,但这应该没关系,对吧?

【问题讨论】:

    标签: azure azure-web-app-service odata powerquery azure-api-management


    【解决方案1】:

    在研究了两天之后,我以典型的方式在 StackOverflow 上发布后立即找到了答案。如果有人有同样的问题,我会留下这个问题。

    问题在于 Power Query 连接器自动跟随 @odata.context 链接获取元数据,以及 @odata.nextLink 链接进行分页。这些链接仍然将应用服务站点作为主机,而不是 APIM 主机。

    因此,快速编辑 APIM 中的出站规则能够解决问题

    <outbound>
        <base />
        <set-variable name="backendBaseUrl" value="@(context.Request.OriginalUrl.Scheme + "://" + context.Request.OriginalUrl.Host.ToString() + context.Api.Path)" />
        <find-and-replace from="@("http://" + context.Request.Url.Host.ToString())" to="@((string)context.Variables["backendBaseUrl"])" />
        <find-and-replace from="@("https://" + context.Request.Url.Host.ToString())" to="@((string)context.Variables["backendBaseUrl"])" />
    </outbound>
    

    这里我必须规则来替换 http 和 https URL,以防某些配置发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2019-02-28
      • 2021-10-20
      相关资源
      最近更新 更多