在客户端处理WCF服务重新启动

the*_*onk 7 wcf exception-handling protocolexception

我有一个GUI客户端,它运行在服务器盒上作为Windows服务托管的WCF服务上运行.WCF服务在PerCall InstanceContextMode中运行,并且客户端具有服务客户端的单例实例,并且我想避免在每次调用时重新实例化单例,因为它使我的许多异步调用变得困难.

对我来说问题是,在重新启动Windows服务之后,每次客户端进行调用时都会收到如下异常消息:

由于服务器启动的关闭,输出会话自动关闭,因此该通道不能再用于发送消息.通过将DispatchRuntime.AutomaticInputSessionShutdown设置为false来禁用自动关闭,或者考虑使用远程服务器修改关闭协议.

什么是最好的解决方法?我可以将try-catch子句放在对服务客户端的所有调用周围,并在通信异常上重新实例化单例实例,但这将涉及大量的样板代码.

mar*_*c_s 9

最好的方法是尽量避免服务器上的异常.如果WCF服务器遇到未被捕获和处理的异常,它将"错误"通道,使其无效.

在服务器端,您可以实现IErrorHandler接口并捕获.NET异常,将它们转换为SOAP错误,这些错误将更优雅地传回客户端,而不会导致通道错误.

这样,您可以捕获服务器上的所有.NET异常,并将它们转换为可互操作的SOAP错误,这些错误不会导致这些问题.

有关更多信息,请参阅:

  • 这个ProtocolException的问题是通道状态仍然是"打开",而不是"故障",并且很难注意到它实际上是不可用的. (6认同)
  • 当WCF服务在IIS中托管而不是由于异常而重新启动时,该做什么,该服务是否重新启动以重新部署? (2认同)