2011-02-25 19 views
9

Tenemos extremos REST y SOAP para nuestro servicio, así que usamos WebFaultException para pasar mensajes amigables. Esto funciona muy bien para las llamadas REST no tanto para las llamadas SOAP. A continuación se muestra el trazado que muestra claramente el mensaje amistoso en el elemento "detalle". Pero la FaultException que se genera en el cliente tiene la descripción del código de estado http en el mensaje, no el mensaje real arrojado desde el servicio. ¿Hay alguna forma de difundir el mensaje deseado en el cliente?La excepción de error WCF no da detalles de la superficie en el cliente para el servicio de jabón

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header></s:Header> 
    <s:Body> 
     <s:Fault> 
     <faultcode xmlns:a="http://schemas.microsoft.com/2009/WebFault" xmlns="">a:BadRequest</faultcode> 
     <faultstring xml:lang="en-US" xmlns="">Bad Request</faultstring> 
     <detail xmlns=""> 
      <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Country code must be 3 characters.</string> 
     </detail> 
     </s:Fault> 
    </s:Body> 
</s:Envelope> 

Además, se trata de .NET 4.0 y estamos utilizando MFA del Castillo (DefaultServiceModel y RestServiceModel).

+0

¿Qué quiere decir exactamente con "superficie"? ¿Qué quieres que suceda en el cliente? –

Respuesta

11

WCF - por defecto y por diseño - no informará información de error detallada por razones de seguridad. Básicamente solo te dirá "algo salió mal en el servidor - mala suerte".

Puede - con fines de desarrollo y prueba - habilitar información de error más detallada, pero debe desactivarla para la producción.

Para permitir que utilizan un comportamiento en servicio en el servidor:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="DetailedDebugging"> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <services> 
     <service name="YourService" 
       behaviorConfiguration="DetailedDebugging" > 
      .... 
     </service> 
    </services> 
</system.serviceModel> 

Ahora su servicio debe informar del fallo de SOAP detallada incluyendo todos los detalles, todo el camino de vuelta a la aplicación cliente.

Actualización: si no recuerdo mal, al manejar un estándar (no mecanografiadas) FaultException, tiene fácil acceso a cosas como el FaultCode y FaultReason etc., pero los detalles del mensaje son un poco engorroso para conseguirlo - intente algo como esto:

try 
{ 
    // your service call here 
} 
catch(FaultException fe) 
{ 
    FaultCode fc = fe.Code; 
    FaultReason fr = fe.Reason; 

    MessageFault mf = fe.CreateMessageFault(); 
    if(mf.HasDetail) 
    { 
     string detailedMessage = mf.GetDetail<string>(); 
    } 
} 

¿Eso le da acceso a la descripción detallada de su error SOAP?

+1

Eso no es lo que es y lo he intentado con fines de depuración. El objetivo de WebFaultException y FaultException es devolver mensajes personalizados. Es por eso que los chicos de WCF lo ponen ahí. – Michael

+0

@Michael: ¿cómo atrapas y manejas la 'FaultException' ?? Ver mi actualización ... –

+0

@Michael: mensajes personalizados no implican excepciones personalizadas. –

Cuestiones relacionadas