You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.ServiceModelASP.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方法。如果测试客户端也无法调用,说明问题在服务端;如果可以调用,那问题出在你的客户端代码或配置。

三、快速验证步骤

  1. 先检查客户端web.config是否添加了AuthenticationManager的net.tcp端点,这是最容易忽略的点;
  2. 用WCF Test Client测试net.tcp端点,快速区分是服务端还是客户端问题;
  3. 查看系统事件日志,找具体的错误细节,不要只看表面的EndpointNotFoundException

内容的提问来源于stack exchange,提问作者Nɪsʜᴀɴᴛʜ ॐ

火山引擎 最新活动