我有一个GUI客户端,它运行在服务器盒上作为Windows服务托管的WCF服务。 WCF服务在PerCall InstanceContextMode中运行,并且客户端有一个服务客户端的单例实例,我想避免在每次调用时重新实例化单例,因为它使我的许多异步调用变得困难。
对我来说,问题是,在重新启动Windows服务之后,每次客户端进行调用时都会收到如下异常消息:
由于服务器启动的关闭,输出会话自动关闭,因此该通道不能再用于发送消息。通过将DispatchRuntime.AutomaticInputSessionShutdown设置为false来禁用自动关闭,或者考虑使用远程服务器修改关闭协议。
解决这个问题的最佳方法是什么?我可以在服务客户端的所有调用周围放置try-catch子句,并在通信异常上重新实例化单例实例,但这将涉及大量的样板代码..
答案 0 :(得分:9)
最好的方法是尽量避免服务器上的异常。如果WCF服务器遇到未被捕获和处理的异常,它将“错误”通道,使其无效。
在服务器端,您可以实现IErrorHandler interface并捕获.NET异常,将它们转换为SOAP错误,这些错误将更优雅地传回客户端,而不会导致通道错误。
这样,您可以捕获服务器上的所有.NET异常,并将它们转换为可互操作的SOAP错误,这些错误不会导致这些问题。
有关详细信息,请参阅:
答案 1 :(得分:0)
您可以看一下这可能会避免一些样板代码: