Dotnet Core自包含(Self-contained)部署调用WCF Soap服务性能极低求助
问题根因
- WCF客户端(svcutil 2.0.2生成的调用骨架)默认单端点最大并发连接数仅为2,高并发下会触发连接排队,导致请求阻塞
- .NET Core独立部署时默认线程池最小线程数等于服务器CPU核数,突发50并发时线程池创建新线程速率仅为每秒1-2个,无法及时处理请求,出现你观测到的不断创建新线程的现象
- IIS托管时AspNetCoreModule会自动根据服务器配置调优线程池最小线程数、请求队列长度,因此不会触发该问题
- 数据库调用无异常是因为数据库客户端默认连接池配置足够,且异步IO不会长时间占用工作线程,不会触发线程池饥饿
解决方案
1. 调整WCF客户端连接限制
修改SOAP客户端初始化代码,放开单端点最大连接限制,同步调整全局HTTP连接限制:
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport) // 按你的实际安全模式调整 { MaxConnections = 200, // 按压测并发量的2-4倍设置 MaxReceivedMessageSize = int.MaxValue, SendTimeout = TimeSpan.FromSeconds(30), ReceiveTimeout = TimeSpan.FromSeconds(30) }; var endpoint = new EndpointAddress("你的SOAP服务地址"); var soapClient = new YourGeneratedSoapClient(binding, endpoint); // 全局HTTP连接限制同步调整 System.Net.ServicePointManager.DefaultConnectionLimit = 200; System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;
2. 手动调整线程池最小线程数
在Program.cs入口最顶部添加线程池配置,该配置必须放在所有业务逻辑初始化之前才能生效:
// 第一个参数为最小工作线程数,第二个为最小IO完成端口线程数,按压测并发量的2倍设置即可 ThreadPool.SetMinThreads(100, 100);
3. 优化SOAP客户端实例生命周期
不要每次请求都新建SOAP客户端实例,避免重复初始化信道、建立连接的开销,推荐用单例注入或者对象池管理:
// Program.cs 中注册单例SOAP客户端 builder.Services.AddSingleton<YourGeneratedSoapClient>(sp => { // 此处放上面的绑定和初始化逻辑 var binding = new BasicHttpBinding{ MaxConnections = 200 }; var endpoint = new EndpointAddress("你的SOAP服务地址"); return new YourGeneratedSoapClient(binding, endpoint); });
如果并发量超过200,可以使用Microsoft.Extensions.ObjectPool库实现SOAP客户端对象池,避免单例实例的锁竞争问题。
4. 调整Kestrel并发限制
可选配置,高并发场景下放开Kestrel的连接限制:
builder.WebHost.ConfigureKestrel(opt => { opt.Limits.MaxConcurrentConnections = 1000; opt.Limits.MaxConcurrentUpgradedConnections = 1000; });
验证方式
调整完成后重新进行50并发压测,观测以下指标:
- 应用线程数稳定在设置的最小线程数附近,不会出现持续暴涨的情况
- SOAP请求响应延迟恢复到正常水平,没有排队阻塞现象
- 没有连接超时、服务端点不可达类的报错
内容的提问来源于stack exchange,提问作者lamxung55
相关产品推荐
相关产品推荐

