8

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

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

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

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

4

2 回答 2

9

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

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

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

有关更多信息,请参阅:

于 2009-12-31T12:56:02.933 回答
0

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

http://wcfproxygenerator.codeplex.com

于 2009-12-31T18:02:04.667 回答