6

我的 Web 服务方法返回一个集合对象,这将很好地序列化,这要归功于 C# Web 服务的工作方式!

但是,如果我的代码抛出一个未捕获的异常,我想改为返回一个自定义错误对象。

这可能使用 C# ASP.NET v2 吗?

例如,

正常操作应返回:

<Books>
    <book>Sample</book>
    <book>Sample</book>
</Books>

但是我想要的错误

  <error>
      <errorMessage></errorMessage>
  </error>
4

1 回答 1

8

是的,这是可能的。

您需要研究的是SoapException 类,特别是 SoapException 类的Detail 属性

SoapException 类将有效地呈现“ Soap Fault ”,这是一种符合标准的机制,用于从 Web 服务方法向客户端/消费者返回错误信息。

SoapException 类的“Detail”属性属于XmlNode类型,因此可以包含单个节点/元素或子节点的层次结构。因此,Detail 节点可以轻松包含并充当您自己的自定义错误对象的序列化表示的“父级”。

来自 MSDN:

Detail 属性旨在提供与 SOAP 请求的 Body 元素相关的特定于应用程序的错误详细信息。根据 SOAP 规范,如果由于 SOAP 请求的 Body 元素导致无法处理客户端请求而发生错误,则必须设置 Detail 属性。如果 SOAP 请求的标头条目中发生错误,则必须抛出 SoapHeaderException,以便在 SOAP 标头中返回错误详细信息。如果由于处理了 Body 元素而没有发生错误,则不能设置 Detail 属性。

在为 Detail 属性构建 XmlNode 时,可以使用 DetailElementName 的 Name 和 Namespace 属性来确保与 SOAP 规范的一致性 [原文如此]。

细节元素的所有直接子元素都称为细节条目,每个细节条目都被编码为细节元素中的一个独立元素。

请注意,如果您希望保持与您的 Web 服务响应正确的 SOAP 兼容,如果错误发生在原始 XML 请求的客户端标头部分中,您将需要返回SoapHeaderException而不是 SoapException (这通常是这种情况使用自定义 SOAP 标头例如安全凭证),如上所述。

于 2009-07-20T14:16:28.137 回答