通过HTTPS使用web服务时引发System.Net.WebException
本文关键字:System Net WebException HTTPS 使用 web 服务 通过 | 更新日期: 2023-09-27 18:00:49
当使用HTTPS对服务器上运行的web服务进行调用时,我的应用程序引发System.Net.WebException,并显示消息"基础连接已关闭:无法与远程服务器建立信任关系"。我不知道如何绕过这个问题并成功地打电话。
经过一番研究,我发现了Jan Tielens的一篇博客文章,其中解释了正在发生的事情以及我的问题的解决方法:
当您浏览到HTTPS网站时,可能会看到一个对话框窗口,询问您是否希望信任Web服务器提供的证书。因此,接受证书的责任由用户承担。让我们回到Web服务场景,如果您想调用位于使用SSL和HTTPS的Web服务器上的Web服务,就会出现问题。当你从代码中进行调用时,不会弹出对话框,询问你是否信任证书(幸运的是,这在服务器端场景中会很难看(;可能会出现以下异常:
System.dll中发生类型为
System.Net.WebException
的未处理异常
附加信息:基础连接已关闭:无法与建立信任关系远程服务器。但有一个解决方案问题,您可以在通过创建自己的代码
CertificatePolicy
类实现ICertificatePolicy
接口(。在这门课上,你会必须自己写CheckValidationResult
函数必须像您一样返回true
或false
会在对话框中按"是"或"否"窗出于开发目的,我创建了以下类接受所有证书,因此您不会再获得讨厌的WebException
:
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public TrustAllCertificatePolicy() { }
public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
{
return true;
}
}
正如你所看到的
CheckValidationResult
函数始终返回true,因此所有证书都将值得信赖。如果你想做这个上课更安全一点,你可以使用添加其他检查例如CCD_ 9参数。要使用此CertificatePolicy
,您将必须告诉ServicePointManager
使用它:
System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
必须执行此操作(在应用程序生命周期(呼叫您的网络服务。
如果您使用的是自签名SSL证书或不受信任的SSL证书,您可以告诉应用程序忽略它(如果您真的想忽略它(。例如
ServicePointManager.ServerCertificateValidationCallback = _
new RemoteCertificateValidationCallback(IgnoreSelfSSL)
public bool IgnoreSelfSSL(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) {
return true;
}
在执行服务调用之前,您可以将回调放在将被命中的任何位置。
答案中给出的提示只能用于测试。对于验收/生产,您应该在调用WS的机器上安装WS证书,并在调用WS之前进行证书验证-过期、主题等。然后,您可以通过SoapHttpClientProtocol.Proxy.ClientCertificates.