转转:解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系。"

今天写程序的时候调用到一个第三方的DLL文件,本机调试一切都正常,但是程序不是到服务器以后一直提示一个BUG:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系"。
后来把DLL文件进行反编译,发现是在获得请求的时候出错了。
引用

WebResponse response = WebRequest.Create("https://……").GetResponse();


于是在服务器上用浏览器打开上面的地址,发现会弹出一个确认证书的窗口,看来是证书问题。
在网上一顿搜索,发现了一个决绝办法甚是好用,而且很简单,在请求之前添加一行代码。
C#代码 复制代码  收藏代码
  1. ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();  
ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();


其中AcceptAllCertificatePolicy需要自己定义:
C#代码 复制代码  收藏代码
  1. internal class AcceptAllCertificatePolicy : ICertificatePolicy   
  2.     {   
  3.         public AcceptAllCertificatePolicy()   
  4.         {   
  5.         }   
  6.   
  7.         public bool CheckValidationResult(ServicePoint sPoint,   
  8.            X509Certificate cert, WebRequest wRequest, int certProb)   
  9.         {   
  10.             // Always accept   
  11.             return true;   
  12.         }   
  13.     }  
internal class AcceptAllCertificatePolicy : ICertificatePolicy

    {

        public AcceptAllCertificatePolicy()

        {

        }



        public bool CheckValidationResult(ServicePoint sPoint,

           X509Certificate cert, WebRequest wRequest, int certProb)

        {

            // Always accept

            return true;

        }

    }




以上方法虽然解决了遇到的问题,可是在VS中会提示ServicePointManager.CertificatePolicy已经被否决。由于我是一个喜欢完美的人,于是按照提示使用新的方法来处理。
改造后的代码更加简洁和明了
C#代码 复制代码  收藏代码
  1. ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;  
ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;


C#代码 复制代码  收藏代码
  1. private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)   
  2.         {   
  3.             return true;   
  4.         }  
private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)

        {

            return true;

        }



就这样了,一个委托搞定!
 
 

你可能感兴趣的:(error)