我正在Docker centos:7
容器上运行DotNet服务,而在dotnet publish
与dotnet run
情况下,代码运行出现问题。
我当前正在运行dotnet服务,该服务侦听端口3480
。看来我正在运行的dotnet代码也试图在同一端口上实例化一个TcpListener
。
在dotnet run
模式下,出现使其发生,在发布时,我遇到address in use
错误。
所以在运行代码之前,我有这个net stat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3840 0.0.0.0:* LISTEN 5017/dotnet
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN -
其中 pid 5017 我的服务正在侦听TCP端口
启动代码后,内容如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 1 0 0.0.0.0:3840 0.0.0.0:* LISTEN 5247/dotnet
tcp 0 0 172.17.0.2:4000 0.0.0.0:* LISTEN 5247/dotnet
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN -
PID 5247 似乎已被接管?
然后,当我终止代码时,我们回到这种状态:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3840 0.0.0.0:* LISTEN 5017/dotnet
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN -
我能想到的唯一区别是当我做一个ps -eo pid, command
时:
5017 /usr/bin/dotnet /usr/share/my-agent/My.Agent.Linux.dll
5247 dotnet exec /devel/SandBox/bin/Debug/netcoreapp2.0/ServerSandbox.dll
如果我运行发布的版本dotnet publish -o publish -r linux-x64 -c Debug
,我会得到:
5017 /usr/bin/dotnet /usr/share/my-agent/My.Agent.Linux.dll
8405 ./publish/My.ServerSandbox
随着代码崩溃,PID
控制端口4080
保持不变。
我的流程虽然是DotNet Runtime
实际上是在管理端口本身-这就是为什么它将允许同一端口打开两次的原因,就像我发布代码时使用的是嵌入式运行时,因此我们被抓捕做了不该发生的事情。
有人以前见过这种行为吗?我一直在兜圈子我为什么不能使发布的版本正常运行,而在挖掘之后,我认为它的运行版本不应该正常运行。
感谢您提供的任何建议/帮助。
答案 0 :(得分:0)
进行一些研究后,我们的服务器确实在执行我们怀疑的操作。我们更改了源代码,以防止两次打开相同的端口,一切都陷入了困境。至于为什么甚至有这种可能,我仍然感到困惑-因此,如果您遇到类似的情况,希望这个问题可以为您提供安慰。