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

求助:.NET Worker Service与局域网考勤钟通信故障排查

排查.NET Worker Service与局域网考勤钟通信失败的方向

以下是针对你的问题的具体排查项,按优先级排序:

一、网络连通性验证

  • 确认生产服务器的局域网实际IP:执行ipconfig查看服务器内网IPv4地址,核对考勤钟配置的主机IP是否为该地址(避免选错网卡,比如误填外网IP或未启用的网卡IP)。
  • 跨网段连通测试:在考勤钟所在网段的其他设备上执行Test-NetConnection -ComputerName [服务器内网IP] -Port 3000,如果测试失败,说明局域网存在VLAN隔离或硬件防火墙拦截,需检查路由器/交换机的端口转发、VLAN配置。
  • 细化防火墙规则检查:
    • 确认入站规则针对TCP协议(你的代码使用TcpListener,仅支持TCP),且规则应用范围包含考勤钟所在的局域网IP段(而非仅本地IP)。
    • 检查服务器是否有第三方安全软件防火墙(如360、Symantec等),这类软件可能会覆盖系统防火墙规则,需手动添加3000端口的放行规则。

二、服务运行状态与权限

  • 确认服务监听范围:在生产服务器执行netstat -ano | findstr :3000,检查输出是否包含0.0.0.0:3000(对应代码中的IPAddress.Any),且进程ID与你的Worker Service PID一致。如果显示127.0.0.1:3000,说明服务仅监听本地回环地址,局域网设备无法连接。
  • 检查服务运行账户:默认Worker Service使用Local System账户,部分环境下该账户的网络权限受限。尝试将服务登录账户改为本地管理员或域账户,重启服务后测试。

三、考勤钟设备配置细节

  • 核对设备通信参数:从配置截图确认:
    • 运行模式确实为客户端模式。
    • 通信端口准确填写3000,无数字错误。
    • 通信模式与你的服务匹配(需为TCP模式,因为代码基于TCP监听)。
  • 验证设备网络可用性:在考勤钟面板查看自身IP地址、子网掩码、网关配置,确保与服务器在同一局域网网段,且能ping通服务器内网IP。

四、代码与日志优化排查

  • 完善错误日志记录:当前代码仅记录成功连接日志,建议添加异常捕获与详细日志,帮助定位问题:
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        string path = @"C:\LogsService";
        string filePath = Path.Combine(path, "log.txt");
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
    
        try
        {
            TcpListener listener = new(IPAddress.Any, 3000);
            listener.Start();
            // 记录监听启动信息
            await LogToFile(filePath, $"Listener started on 0.0.0.0:3000");
    
            while (!stoppingToken.IsCancellationRequested)
            {
                using var client = await listener.AcceptTcpClientAsync(stoppingToken);
                try
                {
                    await LogToFile(filePath, $"New connection from: {client.Client.RemoteEndPoint?.ToString()}");
                    // 此处可添加客户端数据处理逻辑
                }
                catch (Exception ex)
                {
                    await LogToFile(filePath, $"Error handling client: {ex.Message}, StackTrace: {ex.StackTrace}");
                }
            }
        }
        catch (Exception ex)
        {
            await LogToFile(filePath, $"Service exception: {ex.Message}, StackTrace: {ex.StackTrace}");
            throw;
        }
        finally
        {
            await LogToFile(Path.Combine(path, "exit.txt"), $"Service exited: {stoppingToken.IsCancellationRequested}");
        }
    }
    
    // 封装日志方法,避免重复代码
    private async Task LogToFile(string filePath, string content)
    {
        using var fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
        using var writer = new StreamWriter(fileStream);
        await writer.WriteLineAsync($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {content}");
    }
    
  • 修复连接释放问题:原代码未主动关闭TcpClient,可能导致连接堆积,用using包裹TcpClient确保连接正常释放。

五、抓包定位问题

在生产服务器上使用Wireshark抓包,过滤tcp port 3000的流量:

  • 如果未收到考勤钟的SYN连接请求:问题出在网络链路(防火墙、VLAN等)。
  • 如果收到SYN但未回复SYN-ACK:服务未正确监听或处理连接。
  • 如果SYN-ACK回复后设备无后续动作:问题出在考勤钟设备端配置或固件。

内容的提问来源于stack exchange,提问作者Rafael Massula

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:02:30