當使用HttpClient請求HTTPS地址遇到報錯時,下面將解析并提供可能的解決方案供參考。
文章目錄
- 異常代碼
- 無法定位錯誤的
- 準確定位錯誤的
- 常見錯誤
- 錯誤1
- 錯誤2
- 解決問題
- 生產環境
- 開發環境
異常代碼
首先,需要查看引發異常的代碼部分,
無法定位錯誤的
以下代碼拋出的異常,是無法定位錯誤的
HttpResponseMessage httpResponse = client.GetAsync(url).Result;
準確定位錯誤的
應改成這樣
HttpResponseMessage responseMessage = client.GetAsync(url).GetAwaiter().GetResult();
由此可見,通過捕獲拋出的異常并獲取其中的錯誤信息,就可以準確定位到問題的所在。
常見錯誤
當遇到問題時,要準確地定位到錯誤所在。
如果錯誤屬于以下兩種情況中的任何一種,
錯誤1
根據驗證過程,遠程證書無效。
錯誤2
基礎連接已經關閉: 未能為 SSL/TLS 安全通道建立信任關系。
解決問題
以前普遍使用http請求, 現在https加密請求需要證書了,
如使用https請求操作不當,會引發證書信任問題,
要解決安全證書信任問題, 主要看使用環境
生產環境
如果是在生產安全環境用的, 就配置信任的證書,
添加代碼如下
System.Net.ServicePointManager.Expect100Continue = true;
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls;client = new HttpClient();
開發環境
如果是在本地測試的, 可以先忽略安全證書信任問題
添加代碼如下
var hander = new HttpClientHandler() { UseCookies = false, //設置為false,登陸后重定向的話不會自動帶上cookies,需要手動給headers上加入cookies.AllowAutoRedirect = true
};hander.ClientCertificateOptions = ClientCertificateOption.Automatic;
//hander.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
System.Net.ServicePointManager.ServerCertificateValidationCallback = (message, cert, chain, errors) =>
{// 在這里添加你的證書驗證邏輯// 例如,永遠返回true來允許所有證書(不推薦用于生產環境)return true;
};client = new HttpClient(hander);
寫到這里,問題差不多就能得到解決了。
來出一道題娛樂一下吧, 知道下圖中是什么游戲嗎