当使用HttpClient请求HTTPS地址遇到报错时,下面将解析并提供可能的解决方案供参考。
文章目录
- 异常代码
- 无法定位错误的
- 准确定位错误的
- 常见错误
- 错误1
- 错误2
- 解决问题
- 生产环境
- 开发环境
异常代码
首先,需要查看引发异常的代码部分,
无法定位错误的
以下代码抛出的异常,是无法定位错误的
HttpResponseMessage httpResponse = client.GetAsync(url).Result;
准确定位错误的
应改成这样
HttpResponseMessage responseMessage = client.GetAsync(url).GetAwaiter().GetResult();
由此可见,通过捕获抛出的异常并获取其中的错误信息,就可以准确定位到问题的所在。
常见错误
当遇到问题时,要准确地定位到错误所在。
如果错误属于以下两种情况中的任何一种,
错误1
根据验证过程,远程证书无效。
错误2
基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。
解决问题
以前普遍使用http请求, 现在https加密请求需要证书了,
如使用https请求操作不当,会引发证书信任问题,
要解决安全证书信任问题, 主要看使用环境
生产环境
如果是在生产安全环境用的, 就配置信任的证书,
添加代码如下
System.Net.ServicePointManager.Expect100Continue = true;
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls;
client = new HttpClient();
开发环境
如果是在本地测试的, 可以先忽略安全证书信任问题
添加代码如下
var hander = new HttpClientHandler() {
UseCookies = false, //设置为false,登陆后重定向的话不会自动带上cookies,需要手动给headers上加入cookies.
AllowAutoRedirect = true
};
hander.ClientCertificateOptions = ClientCertificateOption.Automatic;
//hander.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
System.Net.ServicePointManager.ServerCertificateValidationCallback = (message, cert, chain, errors) =>
{
// 在这里添加你的证书验证逻辑
// 例如,永远返回true来允许所有证书(不推荐用于生产环境)
return true;
};
client = new HttpClient(hander);
写到这里,问题差不多就能得到解决了。
来出一道题娱乐一下吧, 知道下图中是什么游戏吗