为什么 Power Query 调用 Azure API 管理后端 URL?
Why does Power Query call Azure API Management backend URL?
我有一个 Azure 应用服务托管一个位于 Azure API 管理 (APIM) 实例后面的 OData 端点。为了防止直接调用应用服务,它受到只有 APIM 拥有的证书的保护。
当我通过 Chrome 或 Postman 调用 APIM URL 时,它的行为符合预期。只有一个请求,没有重定向或有趣的业务,它 returns OData 根。
Here is a Fiddler log of a request to the APIM using Postman
但是,当使用 OData.Feed() 在 Power Query 中使用相同的 URL 作为 OData 源时,它 returns 一个转发到后端的 301 URL ,这显然失败了,因为 URL 受证书保护。 Here is a Fiddler log of a request to the APIM using Power Query in Excel
我已将订阅密钥配置为在 headers 中传递,但我也尝试将其作为查询参数,但它在 Power Query 中均不起作用。我也试过直接使用 OData 实体端点(以避免 $metadata 调用)但没有成功。
Power Query 使用的用户代理是 Microsoft.Data.Mashup,但我还没有找到任何关于它与 APIM 兼容性的文档,但这应该无关紧要,对吗?
以典型的方式,在处理了两天之后,我在 Whosebug 上发帖后立即找到了答案。如果有人有同样的问题,我会留下这个问题。
问题是 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,以防某些配置更改。
我有一个 Azure 应用服务托管一个位于 Azure API 管理 (APIM) 实例后面的 OData 端点。为了防止直接调用应用服务,它受到只有 APIM 拥有的证书的保护。
当我通过 Chrome 或 Postman 调用 APIM URL 时,它的行为符合预期。只有一个请求,没有重定向或有趣的业务,它 returns OData 根。 Here is a Fiddler log of a request to the APIM using Postman
但是,当使用 OData.Feed() 在 Power Query 中使用相同的 URL 作为 OData 源时,它 returns 一个转发到后端的 301 URL ,这显然失败了,因为 URL 受证书保护。 Here is a Fiddler log of a request to the APIM using Power Query in Excel
我已将订阅密钥配置为在 headers 中传递,但我也尝试将其作为查询参数,但它在 Power Query 中均不起作用。我也试过直接使用 OData 实体端点(以避免 $metadata 调用)但没有成功。
Power Query 使用的用户代理是 Microsoft.Data.Mashup,但我还没有找到任何关于它与 APIM 兼容性的文档,但这应该无关紧要,对吗?
以典型的方式,在处理了两天之后,我在 Whosebug 上发帖后立即找到了答案。如果有人有同样的问题,我会留下这个问题。
问题是 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,以防某些配置更改。