我的Web服务方法返回一个集合对象,这将很好地序列化,这要归功于C#Web服务的工作方式!
但如果我的代码抛出未捕获的异常,我想返回一个自定义错误对象。
这是否可以使用C#ASP.NET v2?
例如,
正常操作应返回:
<Books>
<book>Sample</book>
<book>Sample</book>
</Books>
但是我想要错误
<error>
<errorMessage></errorMessage>
</error>
答案 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作为安全凭证,通常就是这种情况),如上所述。