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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:07:52