通过HTTPS使用Web服务时抛出System.Net.WebException

Bra*_*rad 11 c# ssl https web-services

当使用HTTPS调用在服务器上运行的Web服务时,我的应用程序抛出System.Net.WebException,并显示消息"底层连接已关闭:无法与远程服务器建立信任关系".我不知道如何解决这个问题并成功拨打电话.

Bra*_*rad 17

经过一些研究,我找到了Jan Tielens的一篇博客文章,其中解释了我的问题以及解决方法:

当您浏览到HTTPS站点时,您可能会看到一个对话窗口,询问您是否要信任Web服务器提供的证书.因此,接受证书的责任由用户处理.让我们回到webservice场景,如果你想调用位于使用SSL和HTTPS的web服务器上的web服务,就会出现问题.当您从代码进行调用时,没有弹出对话框窗口,并询问您是否信任该证书(幸运的是,因为这在服务器端场景中非常难看); 可能你会得到以下异常:

System.Net.WebExceptionSystem.dll中发生未处理的类型异常
附加信息:底层连接已关闭:无法与远程服务器建立信任关系.

但是有一个解决这个问题的方法,您可以通过创建自己的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,该 CheckValidationResult函数始终返回true,因此所有证书都将受信任.如果要使此类更安全一些,可以使用X509Certificate参数添加其他检查 .要使用它CertificatePolicy,你必须告诉ServicePointManager 使用它:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
Run Code Online (Sandbox Code Playgroud)

在调用您的Web服务之前,必须完成此操作(在应用程序生命周期中一次).