WCF net.tcp端点不可用:EndpointNotFoundException排查求助
排查WCF net.tcp端点间歇性不可用问题
先梳理下你的核心问题:WCF服务的HTTP端点完全正常,但net.tcp端点间歇性无法访问,重启系统有时能恢复,但再次重启又会复现,调用时抛出EndpointNotFoundException。下面从系统和代码配置两个维度给你具体的排查建议:
一、Windows 10系统层面排查
这些是最容易导致间歇性故障的系统级因素:
- 检查Net.Tcp Port Sharing Service状态:net.tcp协议依赖这个服务来共享端口,很可能它没有设置为自动启动,或者运行中意外停止。按Win+R输入
services.msc找到这个服务,确保启动类型是「自动」,且当前状态是「正在运行」。如果之前是手动启动,改成自动后重启系统测试。 - 验证IIS Net.Tcp Listener Adapter服务:如果你的WCF服务是IIS托管的,这个服务负责监听net.tcp请求,同样在服务管理器中确认它的启动类型是自动且处于运行状态。
- 排查防火墙规则:Windows防火墙可能间歇性拦截net.tcp流量。你可以临时关闭防火墙测试是否恢复(测试完记得打开),或者手动添加入站/出站规则:允许TCP协议,端口指定net.tcp使用的端口(默认是808,如果你改了就填对应的端口)。
- 检查端口占用情况:用管理员权限打开命令提示符,执行
netstat -ano | findstr :808(替换成你的net.tcp端口),看看有没有其他进程占用了这个端口。如果有,找到对应的PID(最后一列),在任务管理器中结束进程,再测试服务是否正常。 - 查看系统事件日志:打开「事件查看器」→「Windows日志」→「应用程序」和「系统」,筛选WCF相关的错误日志(来源通常是
System.ServiceModel或ASP.NET)。这里会有比表面异常更详细的信息,比如绑定失败、服务启动失败的具体原因,能帮你定位根因。
二、代码与配置层面排查
结合你提供的代码和web.config,重点关注这些点:
- 检查客户端Endpoint配置缺失问题:我注意到你提供的客户端web.config里,
<client>节点下只配置了AccountManager的net.tcp端点,但你调用的是AuthenticationManagerClient!这很可能是核心问题——客户端没有找到对应的net.tcp端点配置,可能默认用了HTTP绑定,导致无法连接net.tcp地址。你需要添加AuthenticationManager的net.tcp端点配置,类似这样:
<client> <endpoint address="net.tcp://localhost/TAServices/AccountManager.svc" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Framework" contract="AccountManager.IAccountManager" name="NetTcpBinding_Framework" /> <!-- 添加这一行 --> <endpoint address="net.tcp://localhost/TAServices/AuthenticationManager.svc" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Framework" contract="TA.ServiceProxy.AuthenticationManager.IAuthenticationManager" name="NetTcpBinding_Framework" /> </client>
- 修复客户端生命周期管理:你的代码中如果调用出现异常,客户端没有被正确关闭/终止,会导致连接池资源泄漏,进而间歇性无法创建新连接。建议用
using语句或者try-finally块来确保客户端资源被正确释放:
public CheckUserLoginResponse AuthenticateUser(CheckUserLoginRequest objCheckUserLoginRequest) { Customer objCustomer = new Customer(); objCustomer.CustomerName = "ABC"; objCustomer.CultureInfo = "English"; using (AuthenticationManagerClient client = new AuthenticationManagerClient()) { try { client.Open(); return client.Check(objCheckUserLoginRequest, objCustomer); } catch (Exception ex) { LoggingFramework.log.Error(ex.Message, ex); client.Abort(); // 异常时强制终止 return null; } } }
或者不用using的话,在finally块里处理关闭逻辑,避免资源泄漏。
- 验证服务端与客户端绑定一致性:客户端的
netTcpBinding配置中transferMode设置为Streamed,要确保服务端的绑定配置和这个完全一致,包括超时时间、消息大小限制等参数,否则会出现兼容性问题导致连接失败。 - 用WCF Test Client验证端点可达性:打开Visual Studio的WCF Test Client(路径通常是
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\WcfTestClient.exe,根据你的VS版本调整),添加net.tcp://localhost/TAServices/AuthenticationManager.svc地址,尝试调用Check方法。如果测试客户端也无法调用,说明问题在服务端;如果可以调用,那问题出在你的客户端代码或配置。
三、快速验证步骤
- 先检查客户端web.config是否添加了
AuthenticationManager的net.tcp端点,这是最容易忽略的点; - 用WCF Test Client测试net.tcp端点,快速区分是服务端还是客户端问题;
- 查看系统事件日志,找具体的错误细节,不要只看表面的
EndpointNotFoundException。
内容的提问来源于stack exchange,提问作者Nɪsʜᴀɴᴛʜ ॐ




