CoreWCF中ReceiveTimeout未生效问题排查求助
CoreWCF NetTcp ReceiveTimeout 不生效问题排查与求助
问题背景
安全部门指出我们的WCF服务未实现超时或保活机制,排查时用CoreWcf.NetTcp创建了简单测试服务,发现ReceiveTimeout完全不生效。
我们自行实现了保活方案,但当用户通过Windows Cmd的telnet连接(不会发送自定义ping消息)时,按预期应该在指定ReceiveTimeout后自动断开连接,但实际未触发。测试中服务启动正常,执行telnet localhost 11999连接后,即使超过10秒超时时间也不会断开,WireShark显示端口无活动,且服务构造函数日志未输出(说明会话未初始化)。
测试代码
服务契约与实现
[ServiceContract] public interface ITestWcfService { [OperationContract] string GetData(int value); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)] public class TestWcfService : ITestWcfService { public TestWcfService() //仅由WCF实例化 { Console.WriteLine("Constructor"); OperationContext.Current.InstanceContext.Faulted += new EventHandler(Channel_Faulted); OperationContext.Current.InstanceContext.Closed += new EventHandler(Channel_Faulted); } private void Channel_Faulted(object sender, EventArgs e) { Console.WriteLine("Faulted"); } public string GetData(int value) { Console.WriteLine("GetData"); return $"{value}"; } }
宿主类代码
public static class MyTestHostClass { public static string ServiceName => "WcfServiceName"; private static WebApplication _app; public static void Open(int port) { var builder = WebApplication.CreateBuilder(); builder.WebHost.UseNetTcp(port); builder.Services.AddServiceModelServices(); _app = builder.Build(); _app.UseServiceModel(serviceBuilder => { serviceBuilder.AddService<TestWcfService>(options => { }); serviceBuilder.AddServiceEndpoint<TestWcfService, ITestWcfService>(GetTcpBinding(), $"net.tcp://0.0.0.0:{port}/{ServiceName}"); }); _app.StartAsync().Wait(); } public static void Close() { if (_app != null) { _app.StopAsync().Wait(); _app.DisposeAsync(); _app = null; } } private static NetTcpBinding GetTcpBinding() { Console.WriteLine("Bindings"); var binding = new NetTcpBinding(SecurityMode.Transport) { CloseTimeout = TimeSpan.FromSeconds(10), OpenTimeout = TimeSpan.FromSeconds(10), ReceiveTimeout = new TimeSpan(0, 0, 0, 10), SendTimeout = TimeSpan.FromSeconds(10) }; return binding; } }
服务启动代码
Console.WriteLine("Hello, World!"); MyTestHostClass.Open(11999); Console.WriteLine("WCF listening on port 11999"); await Task.Delay(Timeout.Infinite);
补充测试与差异
编辑1:.NET Framework 对比
在.NET Framework 4.7.2的WinForms应用中托管相同服务,ReceiveTimeout可正常生效。不确定是CoreWCF存在bug,还是遗漏了CoreWCF特有的配置项。
编辑2:客户端连接测试
客户端代码:
private ITestWcfService Client; public Form1() { InitializeComponent(); var myBinding = new NetTcpBinding() { CloseTimeout = TimeSpan.FromSeconds(5), OpenTimeout = TimeSpan.FromSeconds(5), ReceiveTimeout = new TimeSpan(0, 0, 0, 5), SendTimeout = TimeSpan.FromSeconds(5) }; var myEndpoint = new EndpointAddress("net.tcp://localhost:11998/TestWcfService"); var myChannelFactory = new ChannelFactory<ITestWcfService>(myBinding, myEndpoint); try { Client = myChannelFactory.CreateChannel(); } catch { } } private void button1_Click(object sender, EventArgs e) { Client.GetData(5); }
测试结果对比
.NET Framework 4.7.2:
- 服务与客户端连接正常
- 服务超时设为10秒,客户端设为5秒
- 闲置10秒后,服务触发超时并通知客户端,客户端主动断开连接,WireShark可观测到相关报文
.NET 6(CoreWCF):
- 服务与客户端连接正常
- 超时配置与上述一致
- 闲置10秒后,服务直接关闭连接但不通知客户端,客户端仍认为连接有效;此时调用服务无法到达,触发客户端5秒超时,服务日志未收到请求
求助
目前怀疑CoreWCF包存在bug,请问该如何解决?是否需要补充CoreWCF特有的配置项?
内容的提问来源于stack exchange,提问作者Alag
相关产品推荐
相关产品推荐

