如何从ASMX Web服务返回错误?

时间:2009-07-20 13:53:23

标签: c# web-services asmx soapfault

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

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

这是否可以使用C#ASP.NET v2?

例如,

正常操作应返回:

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

但是我想要错误

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

1 个答案:

答案 0 :(得分:7)

是的,这是可能的。

您需要了解的是SoapException class,特别是SoapException类的Detail property

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规范的constancy [sic]。

     

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

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