當使用HTTPS調用服務器上運行的Web服務時,我的應用程序拋出System.Net.WebException,並顯示消息「底層連接已關閉:可以不與遠程服務器建立信任關係「。我不知道如何解決此問題併成功撥打電話。通過HTTPS消費Web服務時引發System.Net.WebException
回答
經過一番研究,我發現了一個博客條目由Jan Tielens這也解釋了是怎麼回事,和我的問題解決方法:
當您瀏覽到一個HTTPS網站,你可能會得到一個對話窗口,詢問你如果你想信任Web服務器提供的證書。所以接受證書的責任由用戶處理。讓我們回到web服務場景,如果您想要調用位於使用SSL和HTTPS的Web服務器上的Web服務,則存在問題。當你通過代碼進行調用時,沒有彈出對話窗口,並詢問你是否信任該證書(幸運的是,這在服務器端場景中會非常醜陋)。也許你會得到以下異常:
System.Net.WebException
類型的未處理的異常出現在System.dll中
附加信息:基本 連接已經關閉:無法 建立與 遠程服務器的信任關係。但對於這個 問題的解決方案,你可以通過創建自己的
CertificatePolicy
類( 實現ICertificatePolicy
接口)在 代碼解決這個問題。在這個類,你會 必須寫自己的CheckValidationResult
功能 必須返回true
或false
,就像你 會按yes或no在對話框 窗口。爲發展宗旨,我 創建了以下類 接受所有的證書,所以你不會 得到討厭WebException
了:
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public TrustAllCertificatePolicy() { }
public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
{
return true;
}
}
因爲你總是可以看到
CheckValidationResult
功能 返回true,所以所有的證書都會被信任 。如果您想讓此類更安全一些,則您可以使用參數X509Certificate
參數添加其他檢查。 要使用此CertificatePolicy
,你 必須告訴ServicePointManager
使用它:
System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
這必須使 調用之前完成(在 應用程序生命週期一次)到您的web服務。
如果您使用自簽名SSL證書或不可信SSL證書,您可以告訴應用程序忽略它(如果您真的想忽略它)。例如
ServicePointManager.ServerCertificateValidationCallback = _
new RemoteCertificateValidationCallback(IgnoreSelfSSL)
public bool IgnoreSelfSSL(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) {
return true;
}
您可以任何地方回調將執行之前您的服務請求被擊中。
回答中給出的提示應該使用僅用於測試。對於驗收/生產,您應該在機器上安裝WS證書以撥打WS,並在調用WS-expiration,主題等之前進行證書驗證。然後您可以通過SoapHttpClientProtocol.Proxy.ClientCertificates將此證書添加到WS請求。
- 1. 通過https消費WCF服務
- 2. 通過JS消費Azure ML web服務
- 3. 駱駝https web服務消費者
- 4. WCF - 通過HTTPS消費SOAP服務 - 請求超時
- 5. 消費Web服務
- 6. 消費Web服務
- 7. 通過C#服務參考消費Java Web服務
- 8. 通過PHP消費的ASP服務器上的SOAP Web服務
- 9. 通過.NET 4.0中的服務引用消費WCF服務
- 10. 通過Web代理消費RESTful Web服務
- 11. 如何通過https消費網絡服務
- 12. 從WCF消費Web服務
- 13. 消費WCF Web服務
- 14. 消費JAX-WS Web服務
- 15. 消費政府Web服務
- 16. Qt消費Web服務
- 17. Saber Web服務消費
- 18. Liferay消費Web服務
- 19. Java Web服務消費.Net
- 20. 與jQuery消費Web服務
- 21. 消費Web服務Android 4.0
- 22. 消費web服務時出錯
- 23. 未通過HTTPS調用Web服務
- 24. 獲得404 WCF Web服務通過HTTPS
- 25. 通過HTTPS訪問web服務給ArgumentException
- 26. C# - 通過https使用REST Web服務
- 27. 通過https調用Web服務
- 28. 通過互聯網消費wcf服務
- 29. 通過局域網消費WAS服務
- 30. 如何通過android消費node.js服務
你能通過瀏覽器訪問URL嗎?如果是這樣,瀏覽器是否提醒您證書無效? – dlev