我们有一个WCF netTcp服务,它可以作为某些遗留应用程序进入我们开发的新服务平台的切入点。服务本身不是很有趣,它基本上只有一个单行服务操作,该操作将请求消息放入邮箱中以供新平台处理。该服务通常一次可以运行数周,但有时重新启动该服务(它是在大型Windows服务中自行托管的)后,它将崩溃并拒绝重新启动,除非重新启动整个服务器。
我们在非生产环境中启用了WCF跟踪,并且能够重现此问题,因此我们对问题有完整的跟踪日志,但是到目前为止,它并没有帮助我们确定根本原因。
我们看到的第一个例外是带有消息SocketException
和本机错误代码An existing connection was forcibly closed by the remote host
的{{1}}。这发生在2746
上。下一个异常(在跟踪中紧随其后)是SocketConnection.HandleReceiveAsyncCompleted
,说CommunicationException
此后,任何使用WCF The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '10675199.02:48:05.4775807'.
对象的尝试都将导致ServiceHost
和标准CommunicationObjectFaultedException
消息。重新启动WCF服务甚至整个Windows服务都会导致立即失败,但有相同的例外。
随后的尝试自动重新启动WCF服务(使用新的The communication object, System.ServiceModel.ServiceHost, cannot be used for communication because it is in the Faulted state
对象)总是会遇到另外两个异常。第一个是ServiceHost
,说AddressAlreadyInUseException
,第二个是There is already a listener on IP endpoint 0.0.0.0:11300. This could happen if there is another application already listening on this endpoint or if you have multiple service endpoints in your service host with the same IP endpoint but with incompatible binding configurations.
,消息为ArgumentException
。
作为参考,管理此WCF服务的Windows服务内部的代码如下:
Instance 'PublisherService@net.tcp:||localhost:11300|PublisherService' already exists in CounterSet 'e829b6db-21ab-453b-83c9-d980ec708edd'.
Parameter name: InstanceName
我意识到这段代码有一些问题,但是我不明白为什么即使重新启动整个Windows服务也无法完全启动WCF服务。一旦WCF服务开始运行,它似乎会无限期地运行,但是如果由于某种原因而重新启动它,则很有可能它将进入此状态,此后,如果不重新启动服务器,它将变得完全不可恢复。如果有人可以为进一步解决根本问题提供任何指导,或者知道可能导致此问题的任何原因,请提供帮助。