2010-02-25 12 views
5

Estoy migrando un cliente de servicio web de WSE a WCF.¿Es posible convertir una SoapException en una FaultException con WCF?

Ya he modificado el manejo interno de errores y errores para manejar las excepciones de error en lugar de SoapExceptions.

El proyecto tiene un conjunto amplio de casos de prueba para probar la falla y el manejo de errores que aún se basa en SoapException. Por varias razones, preferiría no reescribirlas todas.

¿Es posible convertir SoapException en FaultException y ejecutar los casos de prueba anteriores contra el nuevo código de manejo de errores?

+0

Tuve exactamente el mismo problema, y ​​me quedé consternado cuando vi cuan pobres eran las respuestas a esta pregunta. Le doy una recompensa con la esperanza de que alguien lo note, a pesar de que es bastante viejo. –

+0

Genial, pero supongo que esto simplemente no es posible. He avanzado y ya no estoy trabajando en este proyecto. IIRC, terminé tragando la píldora amarga y cambiándola a todas partes. Pero no recuerdo ningún detalle. –

+0

Por una cosa, creo que la redacción se ha invertido, ¿no quieres FaultExceptiom -> SoapException (para probar)? –

Respuesta

1

¿Qué pasa con el uso de un inspector de mensaje? ¿Has comprobado el IClientMessageInspector?

Puede tener este aspecto:

El mensaje inspector de

public class MessageInspector : IClientMessageInspector 
{ 
    ... 

    #region IClientMessageInspector Members 
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
    { 
     //rethrow your exception here, parsing the Soap message 
     if (reply.IsFault) 
     { 
      MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue); 
      Message copy = buffer.CreateMessage(); 
      reply = buffer.CreateMessage(); 

      object faultDetail = //read soap detail here; 

      ... 
     } 
    } 
    #endregion 

    ... 
} 

El comportamiento de punto final

public class MessageInspectorBehavior : IEndpointBehavior 
{ 
    ... 

    #region IEndpointBehavior Members 
    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
    { 
     MessageInspector inspector = new MessageInspector(); 
     clientRuntime.MessageInspectors.Add(inspector); 
    } 
    #endregion 

    ... 
} 

http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx

Creo que una buena práctica consiste en use exceptions as faults too.

+0

JSBangs, confío en que me digas si esto funciona para ti, en cuyo caso lo marcaré como una respuesta aceptada. (Solo yo puedo repartir tu recompensa ahora, ¿correcto?) –

+0

Considerando que JSBangs te dio su recompensa, marcaré esto como la respuesta aceptada. Sin embargo, no veo de inmediato cómo se relaciona esto y no tengo los medios para investigar. –

2

¿qué tal

captura SoapException y lanzando FaultException (una solución, no la recomendación)

catch(SoapException) 
{ 
throw new FaultException(); // something similar 
} 
+0

Probablemente no debería haber dicho "envolver la SoapException en una FaultException" (editada ahora) ya que fue bastante engañosa. Por supuesto, quiero que FaultException preserve todas las propiedades de SoapException (es decir, código, mensaje, detalle, etc.), de modo que las pruebas unitarias puedan ejecutar las afirmaciones existentes en el código de manejo de errores. –

0

Usted debe ser capaz de utilizar EnterpriseLibrary para convertir el FaultException a un SoapException en un límite determinado, en este caso cliente proxy.

+0

De nuevo, quiero convertir * de * una SoapException * a * una FaultException, ¡no al revés! Pero buscaré en EnterpriseLibrary, gracias. –

-1

Puede intentar implementar IErrorHandler Interface. En el método HandleError, vuelva a lanzar la excepción envuelta en SoapException. Luego tienes que registrarlo globalmente (web.config o lo que sea).

Ejemplo de cómo esto ayudará a (pseudo código):

public SoapErrorHandler : IErrorHandler 
{ 
    public void HandleError(Exception ex) 
    { 
     throw new SoapException(ex.Message, ex); 
    } 
} 
+0

No estoy seguro de entender cómo eso me ayudaría a convertir * de * una SoapException * a * una FaultException. –

+0

He agregado un ejemplo de pseudocódigo, espero que esto ayude. –

+0

Lo siento, sigue la dirección equivocada. :) Supongo que esto ayudaría si quisiera convertir una FaultException en una SoapException. Sin embargo, no lo hago, como se dijo anteriormente. –

Cuestiones relacionadas