求助:.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端口的放行规则。
- 确认入站规则针对TCP协议(你的代码使用
二、服务运行状态与权限
- 确认服务监听范围:在生产服务器执行
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
相关产品推荐
相关产品推荐

