httpclient发送请求出错System.Net.Http.HttpRequestException: The SSL connection could not be established
本人在改造旧项目时遇到一个http发送请求在本地怎么都好使,但是在测试服务器始终失败的问题,给的错误信息也只有一句话:“发送请求时出错”,使用的是HttpClient对象发出的请求。
使用PostMan也是可以正常发送的,但是就是一到测试服务器就失败,我的测试服务器是配置了https证书的,目标服务器也是https,费了好久排查代码问题,甚至不惜更换底层代码还是不好使。 被逼无奈还是百度吧,没想到网上早就有类似问题了:
我的上一篇采坑文章:APP项目http请求无法通信的错误:c# – 因为算法不同,客户端和服务器无法通信
原因是:发送请求的消息http协议版本问题,应该设置.net 4.5支持的最高版本TLZ1.2,我原来已经遇到过一次这个坑了,只是上次的坑错误比较明显,这次的坑就这么一句不明不白的话。 哎,“发送请求时出错”。
解决方案:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
如果修改协议版本不好使,针对:浏览器好使,postman好使,就程序不好使的情况,依然报:time out或者SSL问题,可以从以下几个方面排查:
1:检查你本地的网络环境,如果你使用了局部FQ的VPN,可能会导致以上问题,浏览器和Postman可能走了FQ的网络,但是程序并不会自动走FQ。 你可以先将VPN设置为全局模式,就是让你的网络的任意的通信请求全部走FQ网络,测试一下你的程序是否正常,如果正常,那么就有两种处理方案:
a:保持VPN全局FQ设置,啥也不用动;
b:继续使用局部FQ,但是程序里设置请求走代理FQ端口,就是让程序走FQ网络,如下:
WebProxy proxy = new WebProxy("http://127.0.0.1:10088"); HttpClientHandler handler = new HttpClientHandler { Proxy = proxy, UseProxy = true }; HttpClient httpClient = new HttpClient(handler);
2:通过设置不验证SSL证书来测试请求是否跟证书有关(如果依然不行,则说明和证书无关,用方案1测试一下):
HttpClientHandler handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }, //SslProtocols = SslProtocols.Tls12, }; HttpClient httpClient = new HttpClient(handler);
3:再次确认目标地址的证书协议版本,确保协议设置适配大多数常见协议(这样服务器只要支持其中一个即可,优先匹配TLS1.3):
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13 | SecurityProtocolType.Tls12;
*博主的文章是自己平时开发总结的经验,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
*我的博客: http://www.cnblogs.com/lxhbky/
浙公网安备 33010602011771号