c# – 通过HTTPS消费Web服务时抛出的System.Net.WebException

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

解决方法

经过一番研究,我发现了一个 Jan Tielens博客文章,解释了发生了什么,并解决了我的问题:

When you browse to a HTTPS site,you probably get a dialog window asking you if you want to trust the certificate provided by the webserver. So the responsibility of accepting the certificate is handled by the user. Let’s get back to the webservice scenario,if you want to invoke a webservice located on a webserver which uses SSL and HTTPS there is a problem. When you make the call from code,there is no dialog window popping up,and asking if you trust the certificate (luckily because this would be pretty ugly in server-side scenarios); probably you’ll get following exception:

An unhandled exception of type System.Net.WebException occurred in System.dll
Additional information: The underlying
connection was closed: Could not
establish trust relationship with
remote server.


但是有一个解决方
你可以解决这个问题
代码创建自己的
CertificatePolicy类(其中
实现ICertificatePolicy
接口).在这个班上你会的
必须自己写
CheckValidationResult函数
必须像你一样返回真或假
会在对话框中按是或否
窗口.为了发展目的,我已经
创建了以下类
接受所有证书,所以你不会
得到令人讨厌的WebException:

public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
    public TrustAllCertificatePolicy() { }

    public bool CheckValidationResult(ServicePoint sp,X509Certificate cert,WebRequest req,int problem)
    {
        return true;
    }
}

As you can see the
CheckValidationResult function always
returns true,so all certificates will
be trusted. If you want to make this
class a little bit more secure,you
can add additional checks using the
X509Certificate parameter for example.
To use this CertificatePolicy,you’ll
have to tell the ServicePointManager
to use it:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();

This must be done (one time during the application life cycle) before making the call to your webservice.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString("x2"));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable<Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include "WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...