2011-01-10 11 views
9

Entiendo que WCF convertirá una excepción en una falla y la devolverá como un mensaje SOAP, pero me preguntaba si esto es realmente interoperable. Creo que estoy teniendo un momento difícil tratando de averiguar esto posible escenario:WCF/WebService: manejo de excepción interoperable

  1. Cliente (Java) llama a un servicio WCF (LoginService).
  2. El servidor comprueba la autorización adecuada, la autorización del usuario falla.
  3. El servidor arroja una excepción de acceso no autorizado.
  4. WCF convierte esto en una falla de alguna manera. (* - Ver abajo también)
  5. El cliente debe saber cómo leer esta falla.

Supongo que estoy teniendo un tiempo difícil entender cómo esto podría ser interoperables, ya que está a la espera de Java para saber cómo traducir un error de SOAP que codifica NET desde una UnauthorizedAccessException.

  • Además, ¿cómo .NET realmente convertir la excepción de un fallo, lo que va en que el código de error, nombre, etc. Algunas de las cosas que parecen ser "duh" s como tal vez el nombre del error es " UnaAnhorizedAccessException ", pero prefiero saberlo con seguridad.
+1

** Las fallas SOAP ** son parte de las especificidades de SOAP interoperables e independientes de la plataforma, así que sí, ¡** SON ** de hecho son interoperables! Cualquier cliente que entienda SOAP debe apoyar y comprender las fallas SOAP también. –

Respuesta

9

No hay "conversión automática". WCF devolverá un error (no recuerdo cuál) cuando tenga una excepción no controlada. Pero como no declaró esa falla, muchos, si no la mayoría, los clientes fallarán si lo devuelve.

Debe definir sus propias fallas y devolverlas. Considere:

[DataContract] 
public class MySpecialFault 
{ 
    public string MyMessage { get; set; } 
} 

[ServiceContract] 
public interface IMyService 
{ 
    [FaultContract(typeof (MySpecialFault))] 
    [OperationContract] 
    void MyOperation(); 
} 

public class MyService : IMyService 
{ 
    public void MyOperation() 
    { 
     try 
     { 
      // Do something interesting 
     } 
     catch (SomeExpectedException ex) 
     { 
      throw new FaultException<MySpecialFault>(
       new MySpecialFault {MyMessage = String.Format("Sorry, but {0}", ex.Message)}); 
     } 
    } 
} 

Cualquier cliente capaz de manejar fallas se encargará de esto. El WSDL definirá la falla y verán un error con el elemento Detalle que contiene una versión serializada de la instancia de MySpecialFault que se envió. Podrán leer todas las propiedades de esa instancia.

4

Las fallas han sido parte de la especificación SOAP desde v1.1. Se explican en el SOAP Specification.

Depende de las implementaciones (WCF, Java, etc.) garantizar que las Fallas se manejen de acuerdo con la especificación.

Dado que WCF convierte las excepciones de falla en fallas de acuerdo con la especificación SOAP, las excepciones de falla lanzadas desde WCF son interoperables.

+0

Bueno, entiendo que las fallas son parte de SOAP, pero principalmente me preguntaba si la excepción .NET a la conversión de fallas funcionaría correctamente. – michael

2

Las fallas SOAP son interoperables, pero las clases de excepciones .NET no son buenas para ser utilizadas en fallas SOAP. En su lugar, defina su propia clase de DataContract (por ejemplo, AccessFault) y luego úselo en FaultContract. ver http://msdn.microsoft.com/en-us/library/ms733841.aspx

Siempre que se arroje una excepción de acceso no autorizada al límite del servicio, conviértala a FaultException. Esto se puede hacer de varias maneras, como usar el Bloque de manejo de excepciones de Microsoft Enterprise Library o implementar la interfaz IErrorHandler.

Cuestiones relacionadas