WireMock.Net 在进程终止后使端口保持打开状态



我开始在测试中使用 WireMock.net,但偶尔当我运行测试时,我会收到异常:

Failed to bind to address http://0.0.0.0:9999: address already in use. ---> Microsoft.AspNetCore.Connections.AddressInUseException: Only one usage of each socket address (protocol/network address/port) is normally permitted ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.

显然,故障出在上次运行中,没有关闭端口。使用来自SysInternals的TCPView,我看到持有该端口的进程是",我无法杀死它,也无法在任务管理器中找到PID,也无法使用taskkill杀死它。我找到的唯一解决方案是重新启动或至少注销/登录到Windows。我搜索了Web(和StackOverflow(,以了解即使进程已被终止,它仍然保留端口,但没有找到任何有用的解释。

因为它只是偶尔发生,并且每次发生都需要重新启动,所以调试和调查成为一场噩梦。似乎当发送应用程序在发送或接收消息时崩溃时会发生,但我不确定。

我想知道:

  1. 如果有人知道在进程终止后端口可以保持打开的条件是什么
  2. 如何预防或减轻这种情况?
  3. 如果发生这种情况,有没有更简单的方法来释放端口?(也许有一个我可以重新启动的服务?

提前谢谢。

为了可能遇到相同问题的任何人:

似乎杀死客户端进程释放了端口。然而,自从我写这个问题以来,它只发生在我身上一次,所以我无法验证它。这回答了我的第三个问题,但我仍然无法准确找到它何时发生以及为什么发生以及如何预防它。

一些建议:

  • 在单元测试中,在随机端口而不是固定端口上运行 WireMock.Net。在构建服务器上运行这些单元测试时,使用固定端口可能会导致问题,不能 100% 保证此端口在操作系统上可用。

一些分析:见 https://www.howtogeek.com/howto/28609/how-can-i-tell-what-is-listening-on-a-tcpip-port-in-windows/

相关内容

最新更新