我需要通过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发送适配器中完成这项工作?
答案 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)
想出来。我应该使用“证书”作为客户端凭据类型。
我只需要:
当我运行Fiddler并将适配器代理设置设置为本地Fiddler地址(http://localhost:8888)时,我偶然发现了这一点。我意识到,由于Fiddler协商TLS连接/证书(我在fiddler中启用tls1.2)到远程服务器,消息能够通过而不是直接在适配器和远程API服务器之间(当Fiddler没有运行时) 。