我在.net 3.5中实现了一个小WCF服务,客户端通过端口4321上的TCP连接。此服务可以产生其他进程(通过System.Diagnostics.Process)。当然,当服务被杀或崩溃或其他什么时,产生的进程仍然存在。我遇到的问题是如果我尝试在这些进程仍然运行时重新启动服务,我会得到以下异常:
CommunicationException:有 已经是IP端点上的监听器 0.0.0.0:4321。确保您没有尝试使用此终点 多次在您的应用程序和 没有其他应用程序 听这个端点。
的确,当我运行netstat时,我可以看到有一个进程侦听端口TCP 4321:
TCP 0.0.0.0:4321 MTL-WKS-AG196:0 Listninging 97308
你在这里看到的进程ID(97308)是我第一次启动的服务之一(它不再存在,因为它被杀死了)。 释放端口的唯一方法是终止在服务生命周期中生成的所有进程。
我对端口和进程知之甚少,但我的理解是子进程“继承”父进程监听的端口。是或多或少会发生什么?
有没有办法取消这种行为?无法访问衍生过程的代码?
另外,我真的不认为这是可能的,但有没有办法告诉Windows在父进程被杀时杀死子进程?
谢谢!
答案 0 :(得分:1)
显然BCL允许所有句柄由子进程继承(在本例中为端口) 见Stephen Cleary response on MSDN Forum
我目前正遇到类似问题,并使用临时解决方法。我启用了Net.Tcp端口共享服务并启用了wcf服务app.config。 (更多信息here)
当我得到时间时,将寻求将斯蒂芬的建议作为一个更永久的解决方案实施:)