• 转转:解决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;
            }
    


    就这样了,一个委托搞定!
     
     
  • 相关阅读:
    .NET CORE 技术债
    .Net Core/Framework之Nginx反向代理后获取客户端IP等数据探索
    托管ASP.NET Core应用程序到Windows服务中
    Office在线预览及PDF在线预览的实现方式大集合
    Ubuntu 16.10 虚拟机安装记录
    .Net Core 之 图形验证码
    Ubuntu之Mysql安装及基本设置
    .Net Core 之 Ubuntu 14.04 部署过程
    常用.net反编译替换正则表达式
    江湖救急:webbrowser中js文件丢失问题~
  • 原文地址:https://www.cnblogs.com/shikyoh/p/2860154.html
Copyright © 2020-2023  润新知