BizTalk 2016:如何使用带有API令牌的HTTP发送适配器

时间:2017-09-22 17:30:06

标签: biztalk biztalk-2016

我需要通过BizTalk Send适配器调用其他API服务。 API只是在标头中使用标记进行身份验证/授权。我已经使用httpclient在C#控制台应用程序中对此进行了测试,它运行正常:

string apiUrl = "https://api.site.com/endpoint/<method>?";
        string dateFormat = "dateFormat = 2017-05-01T00:00:00";

        using (var client = new HttpClient())
        {

            client.DefaultRequestHeaders.Add("token", "<token>");
            client.DefaultRequestHeaders.Add("Accept", "application/json");

            string finalurl = apiUrl + dateFormat;
            HttpResponseMessage resp = await client.GetAsync(finalurl);
            if (resp.IsSuccessStatusCode)
            {
                string result = await resp.Content.ReadAsStringAsync();
                var rootresult = JsonConvert.DeserializeObject<jobList>(result);
                return rootresult;

            }
            else
            {
                return null;
            }
        }

但是我想使用BizTalk来进行调用并处理响应。

我尝试过使用wcf-http适配器,选择“传输”作为安全性(它是一个https站点,因此需要安全性(?)),没有指定凭证类型,并在“消息”中放置带有令牌的标头适配器配置的选项卡。虽然例外但是失败:System.IO.IOException:身份验证失败,因为远程方已关闭传输流。

我尝试使用谷歌搜索这个特定的场景,但无法找到解决方案。我确实找到了this文章,提出了有关OAUth处理的建议,但我很惊讶即使使用BizTalk 2016,我仍然需要为这么简单的事情创建一个自定义程序集。

有谁知道如何在wcf-http发送适配器中完成这项工作?

2 个答案:

答案 0 :(得分:2)

是的,您必须编写自定义端点行为并将其添加到发送端口。事实上,使用WCF-WebHttp适配器甚至Basic Auth doesn't work,所以我正在编写一个端点行为来解决这个问题。

OAuth的一个问题是,每个人都没有遵循一个标准,到目前为止,我必须编写2个不同的OAuth行为,因为他们已经以不同的方式实现了这些行为。使用密钥和时间戳的人必须获得令牌,而另一个使用Basic Auth获取令牌。其中一个你可以使用相同的信用卡获得多个令牌,而另一个将直接使旧令牌过期。

我必须编写自定义行为的另一件事是终端期望的TLS版本,默认情况下BizTalk 2013 R2会尝试TLS 1.0,如果网站不允许,则会失败。< / p>

您可以通过在Add support for OAuth 2.0 / OpenID Connect authentication

上投票,向Microsoft反馈您希望拥有此功能的信息

也许有人会开源他们的解决方案。请参阅公告:BizTalk Server embrace open source!

答案 1 :(得分:2)

想出来。我应该使用“证书”作为客户端凭据类型。

我只需要:

  1. 在“消息”选项卡的“出站HTTP标头”框中添加令牌,并为“传输”客户端凭据类型选择“传输”安全性和“证书”。
  2. 通过浏览器(手动)从API网站下载证书,并将其安装在本地服务器证书存储区中。
  3. 然后,我通过“浏览”按钮在适配器的相应字段中选择了证书和指纹(必须滚动可用的证书并选择我尝试连接的API /网站证书)。
  4. 当我运行Fiddler并将适配器代理设置设置为本地Fiddler地址(http://localhost:8888)时,我偶然发现了这一点。我意识到,由于Fiddler协商TLS连接/证书(我在fiddler中启用tls1.2)到远程服务器,消息能够通过而不是直接在适配器和远程API服务器之间(当Fiddler没有运行时) 。