You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework4.7.2用WinHttpHandler发送带Body的GET请求遇12175错误求助

解决方案:.NET Framework 4.7.2中带Body的GET请求及WinHttpHandler 12175安全错误处理

问题分析

你遇到的12175错误是WinHttp的SSL/TLS握手安全失败,即便设置了证书验证回调返回true,仍可能因WinHttp底层的额外检查(如证书吊销列表、证书链完整性)或Handler配置不全导致问题。以下是几种可行的解决方法:


方法1:调整WinHttpHandler的SSL相关配置

补充以下配置,覆盖WinHttp默认的安全检查逻辑:

WinHttpHandler handler = new WinHttpHandler();
// 禁用证书吊销列表检查(若服务器证书无法访问吊销列表会触发错误)
handler.CheckCertificateRevocationList = false;
// 确保证书验证回调正确触发(可添加日志确认是否执行)
handler.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => 
{
    // 可在此添加日志输出,确认回调是否被调用
    // Debug.WriteLine($"SSL错误类型: {sslPolicyErrors}");
    return true;
};
// 仅保留目标服务器支持的TLS版本(优先用Tls12,避免旧版本协议兼容性问题)
handler.SslProtocols = SslProtocols.Tls12;

HttpClient client = new HttpClient(handler);
var requestSELF = new HttpRequestMessage(HttpMethod.Get, "https://ABC/XYX");
requestSELF.Headers.Add("HEADER1", "ABC");
requestSELF.Headers.Add("HEADER2", "ABC");

var content = new StringContent(JsonUtils.ConvertToJson(body), Encoding.UTF8, "application/json");
requestSELF.Content = content;
// 建议改用await避免同步阻塞引发的死锁风险(如果运行环境支持异步)
var responseHARD = await client.SendAsync(requestSELF);

方法2:改用HttpWebRequest直接实现

绕过HttpClient的限制,直接用HttpWebRequest发送带Body的GET请求(虽不符合HTTP规范,但可满足需求):

var request = (HttpWebRequest)WebRequest.Create("https://ABC/XYX");
request.Method = "GET";
request.ContentType = "application/json";
// 添加请求头
request.Headers.Add("HEADER1", "ABC");
request.Headers.Add("HEADER2", "ABC");
// 全局设置SSL协议,确保与服务器兼容
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// 禁用证书验证(仅针对测试环境或完全信任的服务器)
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true;

// 写入请求Body
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
    string jsonBody = JsonUtils.ConvertToJson(body);
    streamWriter.Write(jsonBody);
}

// 获取并处理响应
using (var response = (HttpWebResponse)request.GetResponse())
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
    string responseContent = streamReader.ReadToEnd();
    // 此处添加响应内容处理逻辑
}

方法3:排查服务器证书及运行环境

  • 确认目标服务器证书是否有效、域名匹配且证书链完整(WinHttp底层可能存在部分强制检查,即使回调返回true也可能触发错误)
  • 若运行环境为Windows,检查系统根证书存储是否包含服务器证书的根证书
  • 排查是否有代理或防火墙拦截了SSL握手请求

内容的提问来源于stack exchange,提问作者Andres Abarca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:45:39