2009-10-05 16 views
5

Estoy convirtiendo el código de ASMX a WCF. En mis servicios web ASMX echo hacia atrás excepciones de SOAP como:¿Qué tipo de excepción debe arrojarse con un Servicio WCF?

if (ex.InnerException != null) 
       { 
        SoapException se = new SoapException(ex.Message, SoapException.ServerFaultCode, Context.Request.Url.AbsoluteUri, ex.InnerException); 
        throw se; 
       } 

¿Qué tipo de excepciones debo tirar de nuevo a los clientes que llaman mi servicio WCF? Supongo que SOAP excepttin es el tipo equivocado, porque el cliente de prueba no lo ve como un error válido, y solo dice: se produjo un error interno en el servicio web.

Respuesta

20

Básicamente, en un servicio WCF, lo mejor es que solo arroje FaultException (o FaultException<T>).

Esto se debe a dos cosas: dado que WCF está diseñado para ser interoperable (su cliente podría ser una aplicación que no sea .NET), no debería usar excepciones .NET, que son demasiado específicas de la plataforma. Y dos: si usa FaultExceptions (que se traducen en fallas SOAP), su canal (la conexión entre el cliente y el servidor) no se desmantelará, o "fallará". El tiempo de ejecución de WCF en el lado del servidor trata todas las excepciones de .NET no gestionadas como excepciones "graves" y, por lo tanto, pone el canal en un estado de error, suponiendo que algo realmente malo ha sucedido.

Si su canal tiene una falla, ya no puede usarlo, tendrá que cerrar su proxy de cliente y volver a crearlo desde cero.

Si usted quiere (o tiene que) ser muy interoperable, definiría sus errores SOAP son culpa contrae (análogo a los contratos de datos) en un archivo separado, y luego se tiraría FaultException<T> donde T habría uno de tus contratos de falla Si eres estrictamente .NET en cualquier lado, también puedes incluir excepciones .NET en FaultException como tipo genérico T, si quieres, el canal no tendrá fallas (por ejemplo, podrías lanzar un FaultException<InvalidOperationException> y así devolver la señal de lo que pasó incorrecto).

+1

Una gran explicación, me gustaría poder votar dos veces. Gracias. – Noich

3

En WCF usa FaultException. Ver por ejemplo here.

+0

+1 para compartir un magnífico ejemplo. – SBirthare

Cuestiones relacionadas