我们已经(在 Go 和 Delphi 中)编写了几个 Windows 微服务,它们响应 11000-12000 范围内特定端口上的 HTTP 请求。这些设计为在客户端的域或专用网络内部运行(即不在互联网上)。
它们可以在我们 50 多个客户端系统中的一个以外的所有客户端系统上完美运行,操作系统范围从 Windows 7/10/11 到 Windows Server 2008R2/2012/2016/2019。这些服务中的每一个的安装过程都会在 Windows 防火墙中设置规则以接受对每个服务 exe 的请求。
他们不使用的一个客户端系统正在运行 Windows Server 2016 Essentials。这是运行该特定操作系统的唯一客户端系统,因此这可能是问题的一个因素。
甚至在本地使用该系统上的 Web 浏览器来查询他们不工作的服务。请求只是等待一段时间然后超时:ERR_CONNECTION_TIMED_OUT。然而,对地址 127.0.0.1 (localhost) 的相同端口的相同请求会立即工作 - 证明服务实际上正在运行。目标服务未运行或我们寻址错误端口时的故障模式是不同的。在这种情况下,我们会得到一个快速的“拒绝连接”失败:ERR_CONNECTION_REFUSED
系统上没有安装第三方防病毒或防火墙产品,仅使用带有普通 Windows 防火墙的 Windows Defender。我们已经尝试了所有我们能想到的 Windows 防火墙,包括完全关闭它。我们尝试过的没有任何改变。
我们已经尝试使用许多替代端口号,但直到达到 49000 及以上范围之前我们都没有取得任何成功,但我们真的宁愿不必更改我们的正常端口号范围,除非它完全不可避免。
我们花了很多时间试图找到任何解决方案,但没有任何运气。我们真的希望那里有一些聪明的人有一些想法,可以找到问题的原因。
正如@HelpingHand 在他对原始问题的评论中所指出的那样,问题是Windows DirectAccess。
客户端没有使用 DirectAccess,但 Windows Server Essentials 附带预配置以分配 6001-47000 的所有端口。PowerShell 命令证实了这一点
结果如下:
我运行了 PowerShell 命令
这改变了 DirectAccess 的端口分配,留下了我们服务所需的差距,然后端口立即开始工作。我什至不必重新启动任何东西。
感谢您的帮助@HelpingHand