2009-09-02 16 views
20

Me gustaría lanzar una excepción personalizada como algún mensaje de error como excepción del servicio web WCF e intentar recibir este mensaje de error de excepción en la aplicación cliente al llamar al método del servicio web.WCF Web Service Error de excepción personalizado al cliente

cómo lanzar una excepción personalizada desde el servicio web WCF y recibir el mismo error de excepción en el lado del cliente.

WCF Web método de servicio:

public bool Read() 
    { 
     if (IsUserValid() == false) 
     { 
      throw new Exception("Authorized user"); 
     } 
    } 

Al lado del cliente

try 
{ 
    _client.Read(); 
} 
catch (Exception e) 
{ 
    MessageBox.Show(e.Message); 
    return; 
} 

Resultado: tirar siempre el mensaje de error como una excepción ** es decir.

"System.ServiceModel.FaultException: El servidor no puede procesar la solicitud debido a un error interno para más información sobre el error, ya sea encender IncludeExceptionDetailInFaults (ya sea de ServiceBehaviorAttribute o de. el comportamiento de configuración ) en el servidor con el fin de enviar la información de excepción de nuevo a el cliente, o activar el rastreo según Microsoft .NET Framework 3.0 SDK documentación e inspeccionar los s erver registros de seguimiento. "

Este es el código es tirar excepción, pero no devolver mismo mensaje de error como lanzados desde el servicio web WCF como un error de excepción

Para sugerir

+0

Puede encontrar respuesta en la pregunta similar: http://stackoverflow.com/questions/5165004/wcf-data-service-error-handling/8225049#8225049 –

Respuesta

2

Para conseguir que esto funcione es necesario hacer dos cosas:

  • definir el contrato de fallos en la interfaz (contrato WCF)
  • emitir la excepción como una excepción culpa
+0

-1 este enlace está muerto –

69

En WCF, no debe lanzar excepciones .NET estándar, esto es contrario a la naturaleza potencialmente interoperable de WCF. Después de todo, su cliente podría ser un cliente Java o PHP que no tiene ningún concepto de excepciones .NET.

En su lugar, debe lanzar FaultExceptions (que es el comportamiento estándar para WCF).

Si usted quiere transmitir a más información sobre lo que salió mal, mira a los genéricos FaultException<T> tipos:

SERVIDOR:

public bool Read() 
{ 
    if (IsUserValid() == false) 
    { 
     throw new FaultException<InvalidUserFault>("User invalid"); 
    } 
} 

O, alternativamente, (como lo sugiere @MortenNorgaard):

public bool Read() 
{ 
    if (!IsUserValid()) 
    { 
     InvalidUserFault fault = new InvalidUserFault(); 
     FaultReason faultReason = new FaultReason("Invalid user"); 

     throw new FaultException<InvalidUserFault>(fault, faultReason); 
    } 
} 

CLIENTE:

try 
{ 
    _client.Read(); 
} 
catch (FaultException<InvalidUserFault> e) 
{ 
    MessageBox.Show(e.Message); 
    return; 
} 

puede declarar las InvalidUserFault como contratos de datos de WCF y definir lo que los miembros puedan viajar de regreso con ese tipo (es decir, código de error, mensaje de error, etc.).

[DataContract] 
[Serializable()] 
public class BusinessFault 
{ 
    ... add your fault members here 
} 

Y a continuación, debe decorar sus métodos de servicio con los posibles fallos que puede lanzar:

[FaultContract(typeof(InvalidUserFault)] 
[OperationContract] 
public bool Read() 
..... 

Por supuesto, el truco "quick'n'dirty" es definir simplemente que el servidor devuelve detalles de la excepción en sus FaultExceptions:

<serviceBehaviors> 
    <behavior name="EmployeeManager_Behavior"> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
</serviceBehaviors> 

y luego se puede inspeccionar de .Detail la excepción real que ocurrió en el servidor de la FaultException - pero de nuevo : esto es más un truco de tiempo de desarrollo en lugar de una solución real.

Marc

+0

gran responder. +1 – dcw

+1

this 'throw new FaultException (" User invalid ");' no es válido, debe pasar un 'InvalidUserFault' real en el ctor. – jajdoo

+0

Sugeriría lo siguiente, porque la razón de la falla parece requerida por la especificación SOAP (ref. Http://stackoverflow.com/questions/9614992/throwing-a-faultexceptiont-from-a-wcf-services-causes-the -creator-de-este-FAU) public bool Read() { si (IsUserValid() == false) { culpa InvalidUserFault = new InvalidUserFault(); FaultReason faultReason = new FaultReason ("Usuario no válido"); throw new FaultException (fault, faultReason); } } –