【问题标题】:Returning results/erros from WCF services. Complex type or an exception?从 WCF 服务返回结果/错误。复杂类型还是异常?
【发布时间】:2011-08-02 08:21:35
【问题描述】:

几天前我问了一个非常相似的问题。我是关于在应用程序中返回值/错误。我接受不将错误作为对象返回但抛出自定义异常的答案。 现在,我不确定如何使用 WCF 服务来处理它。我希望服务对客户来说尽可能简单。

一般来说,我的项目是这样的: 客户端 -> WCF 服务应用程序 -> 数据库。

在 WCF 应用程序中,我有自己的异常类,它运行良好。但是假设客户想要从数据库中获取某物。我的问题是: 我应该在我的应用程序之外向客户返回什么? A. 复杂类型:带有元数据的值(有关可能的错误[1] 的信息)。当真正发生意外错误时抛出异常。 B. 只是一个值(当可能发生错误时——抛出异常)

[1] - 无效的字符串格式,无法连接到数据库或类似的东西。我的意思是-如果我知道错误到底是什么-为什么要向客户端抛出异常-我不确定。

【问题讨论】:

  • 尝试Either(也称为Tagged Unionconstruction,它包含一个值或一个错误。当我在 WCF 中使用它时,它变得非常强大。

标签: c# .net wcf custom-exceptions


【解决方案1】:

如何解决这个问题的决定取决于客户。如果您必须支持 Silverlight 客户端,则抛出异常是不可能的,因为使用浏览器 HTTP 堆栈的 Silverlight 客户端无法处理它们。对于 Silverlight 客户端,我通常推荐(并自己使用)here 描述的方法。

【讨论】:

  • 好点。我不确定客户的情况-可能是silverlight。因此,就像 Tim 所说的那样,在这种情况下使用 Fault 合约并不是一个好主意,对吧?
  • 我非常喜欢这个解决方案。我将在 ASP.NET Web 应用程序中使用我的 WCF 服务。但是与 WPF 或 Windows Form 客户端一起使用它是不是很糟糕?
  • 我将按照您的链接中描述的示例进行操作。谢谢
【解决方案2】:

按照设计,WCF 对客户端隐藏异常。当异常发生时,由开发人员决定向客户端返回什么信息(如果有)。

我会考虑使用FaultContractFaultContract<T>,并通过该机制返回您希望的异常。

这里有一些文章可以看:

Fault Contract WCF Tutorial Fault Contract

您可能还想查看 WCF 的 IErrorHandler:

IErrorHandler Interface

【讨论】:

  • 故障合约——这就是我现在使用的。当发生错误/异常时,我将我的“故障合同”异常抛出给客户端。对此我不确定。在您的第一个链接(带有计算器示例)中 - 服务可以检测数字是否为零并通过简单消息将该信息返回给客户端 - 不是例外。
  • 我希望一个健壮的服务(或应用程序)能够以非异常方式处理预期的异常(我希望这是有道理的)。我建议将 FaultContracts 作为向客户端返回异常数据以解决意外问题的一种方式。而且,正如 Oliver Wiechhold 指出的那样,它对 Silverlight 完全没用(我不知道没有使用 Silverlight)。对于返回结果(甚至是除以零之类的错误类型结果),我会让服务将其作为消息返回,而不是异常,如您所说。
  • 非常感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2011-10-31
  • 2011-03-21
  • 2018-06-26
相关资源
最近更新 更多