2017-04-13 77 views
0

我有一個.Net 4.5.2 WebApp調用我的API。當我將我的web應用程序指向我的API的LocalHost版本時,它獲取數據,並返回正常。我發佈了該API,並確認該API與PostMan正常工作。 後來我跑完全相同的Web應用程序代碼,從本地主機只改變URI住API,我也得到由以下的倍數異常錯誤:HttpClient.GetAsync適用於LocalHost API,但不適用於Live API

  1. 一個現有的連接被強行關閉遠程主機
  2. 無法從傳輸連接讀取數據:現有連接被遠程主機強制關閉。
  3. 底層連接已關閉:發送時發生意外錯誤。
  4. 發送請求時發生錯誤。

這裏是我的調用代碼

using (HttpClient client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    client.DefaultRequestHeaders.Add("user", serializedUser); 
    response = null; 
    try 
    { 
      //Uri uri = new Uri("https://jsonplaceholder.typicode.com/posts/1");//https works 
      Uri uri = new Uri("https://api.acme.com/values/test"); 
      //Uri uri = new Uri("http://localhost/5000/values/test"); //http localhost works 
      response = client.GetAsync(uri).Result; 
     } 
     catch (Exception e) 
     { 
      string er = e.Message; 
     } 
} 

編輯1:我創建了一個.NET核心應用從無到有,和我原來的代碼工作完美地叫我的生活API。我的原始代碼也可以在.NET 4.5.2中調用不同的「https」API。

編輯2: 所以這是我在哪裏,現在,我已經從2015年VS創建兩個通用的應用程序,一個是.NET的核心Web應用程序,另一個是.NET框架Web應用程序。我已經在兩個應用程序中使用上述代碼完全相同來調用API。在這兩個應用程序中,我都可以調用我在網上找到的通用「https」api(jsonplaceholder)。我也可以在兩個「http」處調用我的應用程序的本地主機版本。在應用程序的.NET Core版本中,我可以調用我的「https」實時API並獲得我正在查找的結果。在.NET Framework應用程序中,我仍然遇到相同的錯誤。

我不明白我的核心和框架請求之間有什麼區別,當另一個沒有時關閉。

+0

不是我的區域,但我懷疑它與你從http更改爲https有關。看看這篇文章是否有幫助:[使用HttpClient進行Https調用](http://stackoverflow.com/questions/22251689/make-https-call-using-httpclient)。 – TnTinMn

+0

你永遠不應該發佈代碼的截圖,你應該把代碼放在你的問題中,然後在網站的編輯器中使用「{}」進行格式化。這樣可以更好地搜索未來的訪問者。 –

+0

@ScottChamberlain修復它。 –

回答

0

看來你是託管安全 HTTP環境(https)的應用程序。您在託管Web API的服務器上使用SSL證書嗎?如果不是,它可能會拋出證書相關的異常。

只需在調用GetAsync之前添加以下行,這將忽略SSL錯誤。

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

這僅建議在Intranet環境或其他無法僞造服務器身份的封閉網絡中使用。

C# Ignore certificate errors?

+0

此修補程序對我無效,我在您的帖子中嘗試了該修復程序,並從您添加的鏈接中嘗試了servicepointmanager解決方案。沒有任何區別。 –

0

添加以下行之前,我的API調用固定的問題,但我很樂意聽到的這行做了解釋,任何安全隱患,這可能強加在我的web應用程序使用它。

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 

道具到此answer

相關問題