.NET Core 中 ServicePointManager 完全无效,因其网络栈重写为基于 HttpClientHandler/SocketsHttpHandler;应改用 HttpClientHandler.SslOptions.EnabledSslProtocols 和 ServerCertificateCustomValidationCallback 配置 TLS 与证书验证。
在 .NET Core(以及后续的 .NET 5+)中,ServicePointManager **完全不起作用**,所有对其属性(如 SecurityProtocol、DefaultConne、
ctionLimitServerCertificateValidationCallback)的设置都会被忽略。
.NET Core 从头重写了网络栈,不再基于旧版 .NET Framework 的 System.Net.ServicePoint 模型。HTTP 客户端底层改用 HttpClientHandler(或其跨平台实现 SocketsHttpHandler),而 ServicePointManager 是一个静态全局配置器,与现代依赖注入、实例化控制和跨平台设计原则冲突。
ServicePointManager 在 .NET Core 中仍存在(为兼容性保留类型),但内部逻辑为空或直接返回默认值ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 不会改变任何实际行为ServicePointManager.ServerCertificateValidationCallback 对 HttpClient 请求无效你需要显式构造 HttpClientHandler 并传给 HttpClient,或通过 DI 注册自定义 handler。
HttpClientHandler.SslOptions.EnabledSslProtocols 控制(.NET Core 2.1+)HttpClientHandler.ServerCertificateCustomValidationCallback
SocketsHttpHandler(而非 ServicePoint)设置var handler = new HttpClientHandler(); handler.SslOptions.EnabledSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13; handler.ServerCertificateCustomValidationCallback = (request, cert, chain, errors) => true; // 仅测试用 var client = new HttpClient(handler);
不能靠 ServicePointManager,而是通过以下任一方式:
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", true)(通常不需要,.NET Core 2.1+ 默认已启用)DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=1
HttpClientHandler 时明确指定 SslOptions.EnabledSslProtocols
AppContext.SetSwitch("System.Net.Http.EnableMultipleHttp2Connections", true) 等开关微调,但 TLS 协议仍需 handler 级控制最易踩的坑是:把 .NET Framework 项目里的 ServicePointManager 设置原样复制到 .NET Core 中,结果 TLS 握手失败或证书验证静默绕过却毫无察觉 —— 因为那些代码根本没生效。