博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ServicePointManager.ServerCertificateValidationCallback 冲突的解决
阅读量:4677 次
发布时间:2019-06-09

本文共 2133 字,大约阅读时间需要 7 分钟。

    ServicePointManager是用于创建、 维护和删除的实例的静态类类。

    当应用程序请求对 Internet 资源统一资源标识符 (URI) 的连接通过ServicePointManager对象,ServicePointManager返回对象,其中包含的主机和方案通过 URI 标识的连接信息。 如果没有现有方案,该主机以及对象ServicePointManager对象返回现有对象; 否则为ServicePointManager对象创建一个新对象。

    .NET Framework 4.6 包括一个新的安全功能,将阻止不安全的密码和哈希算法的连接。 默认情况下,使用 TLS/SSL 通过例如 HttpClient、 HttpWebRequest、 FTPClient、 SmtpClient、 SslStream 等的 Api 和面向.NET Framework 4.6 的应用程序获得更安全行为。

     开发人员可能想要选择退出此行为以便保持其现有 SSL3 服务或 TLS 带 RC4 服务与互操作性。 说明如何修改你的代码,以便禁用新的行为。

     当我们要使用servicepointmanager.servercertificateValidationCallback验证我们请求的证书时,如果请求是一个https请求,并且有多个线程并发请求的话,由于servicepointmanager是一个全局变量,只设置一次那么整个相关的https的请求都会进入这个回调函数中,并且不能单独设置,这个时候你就要注意使用方法了,如果你想设置多个回调来分别区分的话,由于多线程的存在,会使得你的回调乱串,即回调不知道使用了那个,有兴趣的朋友可以开多线程测试一下。

    基于以上的原因,其实在使用这个类时,最好的方法是:由于serverpointmanger是一个全局变量,那个全局最好就只设置一次回调方法,所有的请求都到这里去区分,这里怎么区分请求是有技巧的,

 1 public delegate bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 

    回调方法如上,我们可以看这个函数的参数,总共三个,其中有两个是无法更改,只有第一个参数,是一个object类型,那我们就利用这个参数,让我们的请求从这个参数中把参数带过来一个标志或其他参数,由于是https请求,所以一般我们使用的是HttpWebRequest这个类来请求路径,我们可以在这个类中添加Headers或者cookies参数,并且是会传到上面的回调的sender里的。

1 HttpWebRequest request = null; 2             HttpWebResponse response = null; 3             StreamReader streamReader = null; 4  5                 var encoding = Encoding.UTF8; 6  7                 request = (HttpWebRequest)WebRequest.Create(url); 8                 request.Method = "post"; 9                 request.ContentType = "text/xml";10                 request.Headers.Add("charset:utf-8");11                 request.Timeout = 15 * 1000; // 15 秒12 13                 request.Headers.Set(HttpRequestHeader.UserAgent, "login");

使用方案:

1 private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)2         {3                     bool IsLogin = false;4                     HttpWebRequest httpWebrequest = (HttpWebRequest)sender;5                     string domain = httpWebrequest.Address.Host;6   }

通过以上方案即可解决多线程调用证书验证,并带参数区分的问题。

转载于:https://www.cnblogs.com/zuimengaitianya/p/9120978.html

你可能感兴趣的文章
杭电2017单人排位赛2-B魔法宝石
查看>>
二分匹配
查看>>
WebService的两种方式SOAP和REST比较 (转)
查看>>
图片,base64 互转
查看>>
ES6 有什么新东西
查看>>
cache—主存—辅存三级调度模拟
查看>>
Java线程的定义
查看>>
UglifyJS 压缩选项
查看>>
面向对象1
查看>>
Python-面向对象(组合、封装与多态)
查看>>
Mininet
查看>>
COSC2531 Programming Fundamentals
查看>>
设计模式系列 - 访问者模式
查看>>
20180507小测
查看>>
前端鼠标点击弹出浮动文字--民主、和谐、爱国、自由等
查看>>
eclipse左侧不见
查看>>
python会缓存小的整数和短小的字符
查看>>
格网与四叉树索引
查看>>
Linux网卡配置文件路径是什么?要使服务器上外网,必须满足的条件有哪些?需要配置什么?...
查看>>
多张照片拍摄、图片浏览
查看>>