【问题标题】:Dealing with WCF service restart on client-side在客户端处理 WCF 服务重启
【发布时间】:2010-12-31 09:50:55
【问题描述】:

我有一个 GUI 客户端,它针对 WCF 服务运行,该服务作为 Windows 服务托管在服务器上。 WCF 服务在 PerCall InstanceContextMode 中运行,并且客户端有一个服务客户端的单例实例,我希望避免在每次调用时重新实例化单例,因为这让我的许多异步调用变得困难。

我的问题是,重启 Windows 服务后,客户端每次调用都会收到如下异常消息:

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

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

【问题讨论】:

    标签: wcf exception-handling protocolexception


    【解决方案1】:

    你可以看看这个,也许可以避免一些样板代码:

    http://wcfproxygenerator.codeplex.com

    【讨论】:

      【解决方案2】:

      最好的办法是一起避免服务器上的异常。如果 WCF 服务器遇到未被捕获和处理的异常,它将“故障”通道,使其无用。

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

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

      有关详细信息,请参阅:

      【讨论】:

      • 这个ProtocolException的问题是通道状态仍然是“Opened”,而不是“Faulted”,很难注意到它实际上是不可用的。
      • 当 WCF 服务托管在 IIS 中并且由于异常而不是重新启动,服务重新启动到重新部署时,该怎么办?
      猜你喜欢
      • 2010-09-22
      • 2011-07-01
      • 1970-01-01
      • 2011-06-06
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      相关资源
      最近更新 更多