2009-08-18 20 views
9

Tengo un servicio web en el que he creado una excepción personalizada. Digamos que el nombre de esta excepción es InvalidContractException.Capturar excepción personalizada del servicio web ASMX

Lo que me gustaría hacer es si ocurre un paso específico, quiero lanzar esta excepción. Sin embargo, no puedo entender cómo el cliente captaría la InvalidContractException para manejarla correctamente.

Este es un servicio web ASP.Net escrito en C#

Respuesta

17

No se puede hacer esto: Servicios

  1. Web hacen errores SOAP. Las excepciones son específicas de la plataforma.
  2. Cuando no se gestiona una excepción en un servicio web ASMX, .NET la traducirá en una falla SOAP. Los detalles de la excepción no están serializados.
  3. En un cliente ASMX, un error SOAP se traducirá a SoapException.

Los servicios web ASMX no cuentan con el soporte adecuado para Fallas SOAP. No hay forma de obtener ninguna excepción que no sea SoapException en el lado del cliente.

Otra razón más para actualizar a WCF.


Como un ejemplo de lo que no puede hacer con ASMX, así es como funciona WCF. WCF le permite especificar, para cada operación de servicio web, que los fallos que pueda volver:

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [FaultContract(typeof(IntegerZeroFault))] 
    [FaultContract(typeof(SomeOtherFault))] 
    [OperationContract] 
    public string GetSomeString(int someInteger); 
} 

[DataContract] 
public class IntegerZeroFault 
{ 
    [DataMember] 
    public string WhichInteger {get;set;} 
} 

[DataContract] 
public class SomeOtherFault 
{ 
    [DataMember] 
    public string ErrorMessage {get;set;} 
} 

public class MyService : IMyServiceContract 
{ 
    public string GetSomeString(int someInteger) 
    { 
     if (someInteger == 0) 
      throw new FaultException<IntegerZeroFault>(
       new IntegerZeroFault{WhichInteger="someInteger"}); 
     if (someInteger != 42) 
      throw new FaultException<SomeOtherFault>(
       new SomeOtherFault{ErrorMessage ="That's not the anaswer"}); 
     return "Don't panic"; 
    } 
} 

Un cliente WCF puede entonces coger FaultException<SomeOtherFault>, por ejemplo. Cuando lo intenté con un cliente Java, fue capaz de detectar SomeOtherFault, que IBM Rational Web Developer creó para derivar de la clase Java Exception.

0

En su llamada cliente al servicio WCF que arroja la falla, lo hace

tratar ..

culpa de captura como FaultException (de YourService.FooBarFault)

extremo tratar

Usted tiene que declarar una FaultContract para el método de servicio que puede generar º e falla, p.

_

<FaultContract(GetType(FooBarFault))> _ 

Function yourCall 
+0

Está usando ASMX. Lo llama "ASP.NET Web Services" –

+0

Ah bien ... pensé que estaba usando WCF –

5

Si su objetivo es lanzar una excepción para que un usuario pueda saber que algo salió mal, se produjo una excepción específica y tiene un manejo especial, tiene una opción. Solo tiene que confiar en una implementación correcta del proxy del cliente (de hecho, una opción es proporcionar los proxies del cliente por su cuenta).

Hay un artículo útil disponible here sobre cómo funciona SoapException s.

Básicamente, se trata de codificar sus detalles de excepción (por ejemplo, un código de error) en el nodo de detalle del SoapException, y luego analizarlo en el lado del cliente antes de volver a lanzar la excepción.

No hay forma de volver a crear la excepción como si se hubiera lanzado a través del límite del servicio, y no hay forma automática de obtener nada, excepto una SoapException en el lado del cliente.

Cuestiones relacionadas