2009-07-20 17 views
6

Mi método de servicio web devuelve un objeto de colección, esto se serializará muy bien, ¡gracias a la forma en que funcionan los servicios web de C#!Cómo devolver los errores de un servicio web ASMX?

Pero si mi código produce una excepción no capturada, quiero devolver un objeto en lugar de error personalizado.

Es esto posible usando C# ASP.NET v2?

Por ejemplo,

funcionamiento normal debe regresar:

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

Pero el error Quiero

<error> 
     <errorMessage></errorMessage> 
    </error> 
+0

Tenga en cuenta que los servicios web ASMX no admiten correctamente las fallas SOAP. El WSDL generado no definirá las fallas, haciendo que algunos clientes las ignoren o devuelvan errores fatales cuando se reciben. Use WCF para evitar este problema. –

Respuesta

7

Sí, esto es posible.

Lo que debe tener en cuenta es el SoapException class, y específicamente el Detail property de la clase SoapException.

La clase SoapException representará efectivamente un "Soap Fault", que es el mecanismo que cumple con los estándares para devolver la información de error a los clientes/consumidores de un método de servicio web.

La propiedad "Detalle" de la clase SoapException es del tipo XmlNode y, por lo tanto, puede contener un solo nodo/elemento o una jerarquía de nodos secundarios. Por lo tanto, el nodo Detalle podría contener fácilmente y actuar como el "padre" para la representación serializada de su propio objeto de error personalizado.

De MSDN:

La propiedad detalle está pensado para el suministro de aplicaciones detalles de error específicos relacionados con el elemento del cuerpo de la solicitud SOAP. De acuerdo con la especificación SOAP, si se produce un error porque la solicitud del cliente no se pudo procesar debido al elemento del cuerpo de la solicitud SOAP, se debe establecer la propiedad Detalle. Si se produce un error en las entradas de encabezado de la solicitud SOAP, debe lanzar SoapHeaderException para que los detalles del error se devuelvan en el encabezado SOAP. Si no se produjo el error, debido al procesamiento del elemento del cuerpo, no se debe establecer la propiedad de detalle.

En la construcción de un XmlNode para la propiedad Detalle, las propiedades del nombre y de espacio de nombres de DetailElementName puede utilizarse para asegurar la consistencia [sic] con la especificación SOAP.

elementos secundarios inmediatos de Todo el detalle elemento se llaman entradas detalle y cada entrada detalle se codifica como un elemento independiente dentro del elemento de detalle.

Tenga en cuenta que si desea permanecer correctamente de SOAP compatible con sus respuestas de servicio web, que necesitará para devolver un SoapHeaderException en lugar de un SoapException si el error se produce dentro de la sección de cabecera del cliente de la solicitud XML original (Esto a menudo puede ser el caso cuando se utiliza custom SOAP headers para, por ejemplo, credenciales de seguridad) como se detalla anteriormente.

+0

¿Podría darnos un ejemplo? –

+0

@JL - El enlace de la clase SoapException en mi respuesta (primer enlace) contiene un código de ejemplo tanto en VB como en C# para arrojar un mensaje de error "personalizado". Es cierto que crea la propiedad Detail creando y agregando manualmente un objeto XmlNode, pero esto podría ser reemplazado por un poco de Xml que se crea al serializar su propio objeto, quizás usando la clase System.Xml.Serialization.XmlSerializer. Vea aquí: http://support.microsoft.com/kb/815813 – CraigTP

+0

¡Respuesta absolutamente perfecta! Gracias Craig ... Recomiendo encarecidamente a cualquiera que intente devolver un objeto de error personalizado que vaya más bien con la excepción estándar de SOAP. Está estandarizado, por lo que es fácil justificar tomar tal acción. –

Cuestiones relacionadas