2017-09-22 72 views
4

我需要通過BizTalk發送適配器調用其他API服務。 API只是在標頭中使用標記進行認證/授權。我一直在使用的HttpClient在C#控制檯應用程序測試這和它的作品罰款:BizTalk 2016:如何使用帶API令牌的HTTP發送適配器

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適配器,爲安全性選擇'Transport'(它是一個https站點,因此安全性是必需的(?)),沒有指定任何憑證類型,並將標頭放置在'messages '適配器配置的選項卡。儘管出現這種情況,但會失敗:System.IO.IOException:由於遠程方關閉了傳輸流,因此身份驗證失敗。

我試過Google搜索這個特定場景並找不到解決方案。我確實發現了this文章,提供了有關OAUth處理的建議,但我很驚訝,即使在BizTalk 2016中,我仍然必須爲如此簡單的事情創建自定義程序集。

有誰知道這可能會在wcf-http發送適配器中完成嗎?

回答

2

是的,您必須編寫自定義端點行爲並將其添加到發送端口。事實上,使用WCF-WebHttp適配器甚至是Basic Auth doesn't work,所以我正在編寫一個端點行爲來解決這個問題。

OAuth的一個問題是,沒有一個標準是每個人都遵循的,到目前爲止,我不得不編寫2種不同的OAuth行爲,因爲他們實施了不同的事情。一個使用祕密和時間戳哈希得到一個令牌,另一個使用基本身份驗證來獲取令牌。其中一個人可以使用相同的信用獲得多個令牌,而另一個會馬上過期舊的令牌。

我不得不編寫一個自定義行爲的另一件事是默認情況下終結點期望的TLS版本BizTalk 2013 R2嘗試TLS 1.0,然後在網站不允許的情況下會失敗。

您可以反饋給微軟,你希望通過Add support for OAuth 2.0/OpenID Connect authentication

投票也許有人會開源軟件的解決方案,有此功能。見公告:BizTalk Server embrace open source!

2

想通了。我應該使用'證書'作爲客戶端證書類型。

我剛:

  1. 添加標記出站HTTP頭箱中的郵件選項卡,選擇「交通運輸的安全和運輸客戶憑據類型「證書」。
  2. 通過瀏覽器(手動)從API網站下載證書並將其安裝在本地服務器證書存儲區中。
  3. 然後,我通過'瀏覽'按鈕在適配器中的相應字段中選擇該證書和指紋(必須滾動瀏覽可用證書並選擇我試圖連接的API /網站證書)。

當我將Fiddler運行並將適配器代理設置設置爲本地Fiddler地址(http://localhost:8888)時,我意外發現了這一情況。我意識到由於Fiddler協商TLS連接/證書(我在fiddler中啓用了tls1.2)到遠程服務器,消息能夠通過但不直接在適配器和遠程API服務器之間(當Fiddler未運行時) 。

相關問題