如何解决 C# IIS 托管的 WCF NET TCP 服务超时问题

Posted

技术标签:

【中文标题】如何解决 C# IIS 托管的 WCF NET TCP 服务超时问题【英文标题】:How to troubleshoot C# IIS-hosted WCF NET TCP service timeout issues 【发布时间】:2020-09-14 08:32:25 【问题描述】:

我在 Windows Server 2019 上继承了由 IIS 托管的 C# Web 服务,该服务遇到了我正在努力追查的问题。

WCF 服务在端口 82 上侦听 http 连接,在端口 8002 上侦听 net tcp 连接;该站点的 IIS 配置将其绑定设置为 http:*:82:,net.tcp:8002:*

但是,当服务运行几个小时后,它会停止在 net tcp 端口 (8002) 上响应 - 尝试连接到它的其他应用程序最终会超时:

System.TimeoutException: The open operation did not complete within the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: The socket transfer timed out after 00:01:00. You have exceeded the timeout set on your binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

但与 http 端口 (82) 的连接仍按预期工作,因此服务仍在运行。

回收适当的应用程序池会导致 net tcp 连接再次开始正常工作,这对我来说可能是某种资源泄漏,但我在代码中看不到任何明显的东西,而且似乎没有是内存不足。

我不知道如何进一步解决这个问题 - 有什么建议吗?

【问题讨论】:

永远不要使用低于 1000 的端口号,它们是为标准协议保留的,并且经常被病毒检查程序阻止。 Sop 将端口号从 82 更改为不同的数字。要从 cmd.exe 调试问题,请使用 >Netstat -a(在客户端和服务器上运行),它将给出每个端口的连接状态。服务器必须正在侦听端口。从客户端到服务器的连接也必须完全关闭,才能从相同的客户端 IP 建立新连接。通常这样的情况是由于旧连接永远不会关闭。 docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/… 您可能会从跟踪中获得一些初步想法,但挂起转储分析或分析器可能会更快(但需要技能)。 【参考方案1】:

根据你的描述,问题可能是连接的客户端数量超过了服务器端的最大容量,服务器处理不了。如果客户端等待超时,就会出现TimeoutException。

您可以通过以下代码查看该服务的最大连接数:

        NetTcpBinding binding = new NetTcpBinding();
        Console.WriteLine(binding.MaxConnections);

这是maxconnections的参考链接:

https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.nettcpbinding.maxconnections?view=netframework-4.8

WCF服务中有servicethrottling属性,指定windows通信基础(WCF)服务的限制机制。 您可以通过在服务中设置 serviceThrottling 来防止过度消耗资源。

以下配置示例指定服务限制最大并发调用数为 2,最大并发实例数为 10。

为了防止过度消耗资源,客户端每次调用后都需要关闭通道。

       ServiceReference1.Service1Client service1Client = new ServiceReference1.Service1Client();
        service1Client.GetData(0);
        service1Client.Close();

有关serviceThrottling的更多信息,请参考以下链接:

https://docs.microsoft.com/zh-cn/dotnet/framework/configure-apps/file-schema/wcf/servicethrottling

【讨论】:

以上是关于如何解决 C# IIS 托管的 WCF NET TCP 服务超时问题的主要内容,如果未能解决你的问题,请参考以下文章

在 IIS 中托管 WCF 服务时如何避免 CommunicationObjectFaultedException?

如何在 IIS 中正确托管连接到 SQLServer 的 WCF 数据服务?为啥我会收到错误消息?

Log4net threadContext 与 IIS 中托管的 WCF 一起使用是不是安全?

WCF / EF / SQL Server / VS2017 / C#:多层应用程序在部署到本地 IIS 10.0 作为托管服务器时出错

从 Windows 应用程序访问托管在 IIS 上的 WCF 服务时出现问题

如何结合调试 Azure 应用服务和 IIS 托管的 WCF?