significado example ejemplos componentes wcf

example - wcf vs web api



WCF Web Service Error de excepción personalizado para el cliente (2)

Me gustaría lanzar una excepción personalizada como algún mensaje de error como una 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.

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

Método del servicio web WCF:

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

En el lado del cliente

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

Resultado: siempre arrojar mensaje de error como una excepción ** es decir

"System.ServiceModel.FaultException: el servidor no pudo procesar la solicitud debido a un error interno. Para obtener más información acerca del error, active IncludeExceptionDetailInFaults (ya sea desde ServiceBehaviorAttribute o desde el comportamiento de configuración) en el servidor para enviar el información de excepción devuelta al cliente, o activar el seguimiento según la documentación de Microsoft .NET Framework 3.0 SDK e inspeccionar los registros de seguimiento del servidor. "

Este es un código que lanza una excepción pero no devuelve el mismo mensaje de error que el del servicio web de WCF como un error de excepción

Por favor recomiende


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 de WCF).

Si desea volver a transmitir más información sobre lo que salió mal, consulte los FaultException<T> genéricos FaultException<T> :

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; }

Debe declarar su InvalidUserFault como contratos de datos de WCF y definir qué miembros pueden 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 luego debe decorar sus métodos de servicio con las posibles fallas que puede arrojar:

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

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

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

y luego puede inspeccionar el .Detail de .Detail para ver la excepción real que ocurrió en el servidor, pero nuevamente: esto es más un truco de tiempo de desarrollo que una solución real.

Bagazo


Para que esto funcione, debes hacer dos cosas:

  • Definir el contrato de falla en la interfaz (contrato de WCF)
  • Lanza la excepción como una excepción de error