【问题标题】:How should I go about handling exceptions thrown within a WCF service?我应该如何处理 WCF 服务中引发的异常?
【发布时间】:2015-09-15 11:13:32
【问题描述】:

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

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

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

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

这是解决此问题的最佳方法吗?如果不是,那是什么?

【问题讨论】:

  • 阅读WCF服务中的FaultContract.....msdn.microsoft.com/en-us/library/ms752208(v=vs.110).aspx
  • 感谢@Viru,但我不确定这就是我所追求的;我不想通知客户端错误,而是通知服务器。除非我读错了,而且两者都用?
  • 你在做自助托管吗?如果你能放一些你到目前为止尝试过的代码,那就太好了......它真的会帮助我理解问题
  • @Viru 如果您确实阅读了 OP 声明他们在 WPF 容器中托管的问题。 FaultContract 也不是 OP 在这里寻找的。你是只看了帖子的标题还是什么?

标签: c# wcf service


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

但是,我可能想多了。 WPF 是一个有效的Microsoft-supported WCF 托管容器,您正在实现的场景可能很常见。

抱歉,漫无边际 - 我试图达成一些让我对你的解决方案普遍感到不安的事情,但我没有做得很好......

【讨论】:

  • 谢谢@Tom,是否有任何特别的理由将事件视为将抛出的异常传递给托管容器的不安全方法?从那以后我尝试使用一个事件,它就像一个魅力,但我只是想知道它是否是解决问题的好(和安全)方法?
  • @Lee.J.Baxter 请查看我的回答的更新 - 为漫无目的道歉
  • 没问题,感谢您的意见!我想真正的问题是,“有正确的方法吗?”;这可能不是常态,但它似乎是一种很好、有效的方式来告诉外部组件服务已抛出异常。我以前从未遇到过这样的事情,但话说回来,直到现在我才真正处理过服务!
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多