深入学习ing

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;

 

posted on 2020-10-17 01:04  深入学习ing  阅读(9369)  评论(0)    收藏  举报

导航