c# ServicePointManager 在 .NET Core 中还起作用吗

来源:这里教程网 时间:2026-02-21 17:37:54 作者:

在 .NET Core(以及后续的 .NET 5+)中,

ServicePointManager
**完全不起作用**,所有对其属性(如
SecurityProtocol
DefaultConnectionLimit
ServerCertificateValidationCallback
)的设置都会被忽略。

为什么 ServicePointManager 被移除了

.NET Core 从头重写了网络栈,不再基于旧版 .NET Framework 的

System.Net.ServicePoint
模型。HTTP 客户端底层改用
HttpClientHandler
(或其跨平台实现
SocketsHttpHandler
),而
ServicePointManager
是一个静态全局配置器,与现代依赖注入、实例化控制和跨平台设计原则冲突。

ServicePointManager
在 .NET Core 中仍存在(为兼容性保留类型),但内部逻辑为空或直接返回默认值
调用
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
不会改变任何实际行为
设置
ServicePointManager.ServerCertificateValidationCallback
HttpClient
请求无效

替代方案:用 HttpClientHandler 配置 TLS 和证书验证

你需要显式构造

HttpClientHandler
并传给
HttpClient
,或通过 DI 注册自定义 handler。

TLS 协议版本由
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);

全局默认协议版本怎么设(比如强制 TLS 1.2)

不能靠

ServicePointManager
,而是通过以下任一方式:

应用启动时调用
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", true)
(通常不需要,.NET Core 2.1+ 默认已启用)
在进程启动早期设置环境变量
DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=1
更可靠的做法:在创建每个
HttpClientHandler
时明确指定
SslOptions.EnabledSslProtocols
.NET 6+ 还支持通过
AppContext.SetSwitch("System.Net.Http.EnableMultipleHttp2Connections", true)
等开关微调,但 TLS 协议仍需 handler 级控制

最易踩的坑是:把 .NET Framework 项目里的

ServicePointManager
设置原样复制到 .NET Core 中,结果 TLS 握手失败或证书验证静默绕过却毫无察觉 —— 因为那些代码根本没生效。

相关推荐