我应该如何处理在WCF服务中抛出的异常?

时间:2015-09-15 11:13:33

标签: c# wcf service

我已经创建了一个侦听命令以启动可执行文件的服务,该服务通过WPF应用程序托管,该应用程序带有向用户显示消息的列表框。

问题是,该服务可能会抛出异常,我想捕获并显示在列表框中;唯一的问题是,我不确定如何捕获这些异常,因为服务当然是从ServiceHost运行的。

我真正想到的最好的事情,不用将服务绑定到UI(我想避免这种情况,以便我可以重新使用它,比如控制台应用程序),就是向服务添加一个事件抛出异常时调用,我将异常传递给处理程序。

我的服务无论如何都是在ServiceHost之外创建的(作为单例对象),因为它有一个启动可执行文件的事件。

这是解决这个问题的最好方法,如果没有,那是什么?

1 个答案:

答案 0 :(得分:1)

  

问题是,该服务可能会抛出异常,我   想抓住并在列表框中显示

我认为最安全的做法是让您的服务操作将异常记录到文件或数据库。

您的WPF应用程序需要一些机制来使用此日志。

这可以使您的服务和托管容器完全分离。

但是,如果您确实希望将WPF应用和ServiceHost结合在一起,请查看WPF/WCF hosting sample on codeplex。 ServiceHost与主机应用程序之间正在进行通信。

  

有什么特别的理由认为某个事件是不安全的   将抛出的异常传递给托管容器的方法?

不是不安全的。我想这是关于复杂性的。实际上,您有两个伪装成单个组件的组件。即使一个组件充当另一个组件的托管容器,它们仍应被视为独立的。

如果从服务操作内部抛出异常,则异常的处理应该是服务的内部。这是SOA的主要内容之一,服务应该是autonomous

如果其他组件感兴趣的例外有副作用,那么这些可以以事件的形式传达给外界。

我想这里的重点应该是事件是否只包含异常?该异常在服务边界内是有意义的,但实际上异常意味着什么?实际上可能有许多不同的原因会导致异常,在这种情况下,您应该为每个失败原因创建不同的事件类型,其中一些可能不适合在服务之外公开。

但是,我可能会过度思考这一点。 WPF是WCF的有效Microsoft-supported主机容器,您正在实施的方案可能很常见。

对不起漫无边际 - 我正试图找到一些让我对你的解决方案感到不安的事情,但是我没有做得很好...