【问题标题】:Encoding issue when passing URL Parameters with BizTalk WCF-WebHttp Send Port使用 BizTalk WCF-WebHttp 发送端口传递 URL 参数时的编码问题
【发布时间】:2020-06-26 07:46:17
【问题描述】:

我正在尝试在 BizTalk 中调用 RESTful API。我需要针对以下端点进行 GET:

https://mycompany.com/buyer/sandboxevol/

我的发送端口中配置了以下映射

<BtsHttpUrlMapping>
  <Operation Name='Operation_1' Method='GET' Url='/page.aspx/en/eai/api/supplier/{id}?apikey={apikey}&amp;format={format}' />
</BtsHttpUrlMapping>

参数 apikey 的值为 XXXXXXXXXXzvrpZHbMdKY75zbszhGOu%2bfnmP7Ms%3d。我已经检查了这一点并从暂停的实例中进行了验证。 但错误消息存在不同的 apikey 值。 参考截图错误信息(hkey值突出显示)

字符 % 在错误消息中被编码为 %25。我认为有两个问题

  1. 无效的 APi 密钥问题(这篇文章讨论了这个问题)和
  2. BizTalk 和第 3 方系统之间打开了一些防火墙/代理(我将与内部管理团队核实)

关于解决此编码/奇怪问题的任何想法

【问题讨论】:

  • 这可能与编码或API密钥无关。如果 API 只需要 TSL 1.2 并且 .Net 的版本不默认使用它,我会经常看到这种错误。请参阅我对这个问题的回答。 stackoverflow.com/questions/62458270/…
  • 谢谢。我正在使用 TLS1.2,它解决了连接问题。但是我仍然有值被编码/更改的问题。请参阅下面的我的 cmets 了解更多详细信息。
  • 您可能想发布一个新问题,详细说明您是如何发送创建和发送 API 密钥的,然后我们可以建议修复该问题。在 Stackoverflow 上,他们希望每个问题一个问题。
  • 您的 WCF 服务使用什么框架?如果您使用的是 .net 3.5 或更低版本,则默认使用 TSL 1.1。如果你使用.net 4.5,虽然它支持TSL 1.2,但不是默认协议。关于TLS的更多信息,请参考这个链接:docs.microsoft.com/en-us/dotnet/framework/network-programming/…

标签: wcf biztalk biztalk-2013


【解决方案1】:

根据错误,它很可能是由于 TLS 版本不匹配而发生的。 BizTalk 2013 默认使用 TLS1.0。现在推荐的版本是使用 TLS1.2 或更高版本。您可以向 API 提供商查询他们使用的 TLS 版本。您可以通过创建自定义发送管道组件来更改 BizTalk 行为,然后在 Execute 方法中使用以下代码设置 TLS 版本。管道组件中的 BizTalk 消息无需更改,只需放置这一行代码并从执行方法返回相同的 pInMsg。

System.Net.SecurityPointManager.SecurityProtocol = SecurityProtocolType.Tls12

引用Microsoft doc

您还可以使用 Postman、Fiddler 等外部工具在 BizTalk 外部测试 API 调用,以确保 API 在 BizTalk 外部工作。

    public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)
    {


        System.Net.SecurityProtocolType protocolType;
        if (!String.IsNullOrEmpty(TlsVersion)
            && Enum.TryParse<System.Net.SecurityProtocolType>(TlsVersion, true, out protocolType))
            System.Net.ServicePointManager.SecurityProtocol = protocolType;
        else
            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;


        return pInMsg;
    }

【讨论】:

  • 我现在使用的是 TLS1.2。 (无法在管道组件中实现,但在自定义 WCF 行为中实现)。现在我从基于 REST 的 API 服务中收到 Invalid API key 错误。我通过传递相同的 apikey 值在 SOAP UI 中进行了尝试,并且在这里也收到了 Invalid API key 错误。但是在 SOAP UI 中,我能够手动禁用编码(禁用 SOAP UI 中的参数编码),然后它在 SOAP UI 中工作。我的猜测是 BizTalk 中正在重复同样的事情。字符 % 正在更改/编码为 %25 并发送到服务。我想知道我们如何在 BizTalk 中实现这一点。谢谢。
  • 我们已经用过很多次了。它适用于管道组件。我已经用代码更新了上面的答案。在代码版本中是由管道属性驱动的。管道组件应在发送管道上使用。我在 BizTalk 2016 PROD 中运行此代码。它避免了修改行为路由所需的 machine.config 文件。
  • 关于编码,BizTalk 适配器默认按设计工作。 % 是 URL 的保留关键字,它正确地将其编码为 %25。您可以寻找实现自定义行为来解决此问题,我不确定。或者如果可能,请 API 提供者在 api 密钥中没有 %。或者如果双方同意,可以在发送前编码为base64。
  • 感谢您的信息。我也能够从 Pipeline 进行 TLS 版本更新。我正在与 API Provider 交谈,并将在 Header 级别而不是在查询级别向他们询问参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 2019-10-26
相关资源
最近更新 更多