2010-11-05 12 views
9

Intentando usar MessageInspector para modificar el mensaje antes del servicio wcf a través del proxy. Sin embargo durante la depuración del cuerpo del mensaje no se copia y el cuerpo muestraCuerpo del mensaje WCF que muestra <s:Body> ... secuencia ...</s:Body> después de la modificación

<s:Body>... stream ...</s:Body> 

¿Cuál es el problema con el código?

public class CustomWCFMessageInspector : IClientMessageInspector 
{ 
    public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     request = ModifyMessage(request); 
     return null; 
    } 

    private Message ModifyMessage(Message oldMessage) 
    { 
     Message newMessage = null; 
     MessageBuffer msgbuf = oldMessage.CreateBufferedCopy(int.MaxValue); 

     Message tmpMessage = msgbuf.CreateMessage(); 
     XmlDictionaryReader xdr = tmpMessage.GetReaderAtBodyContents(); 

     XDocument xd = ConvertToXDocument(xdr); 

     EmitTags(xd); 

     var ms = new MemoryStream(); 
     var xw = XmlWriter.Create(ms); 
     xd.Save(xw); 

     xw.Flush(); 
     xw.Close(); 

     ms.Position = 0; 
     XmlReader xr = XmlReader.Create(ms); 

     newMessage = Message.CreateMessage(tmpMessage.Version, null, xr); 
     newMessage.Headers.CopyHeadersFrom(tmpMessage); 
     newMessage.Properties.CopyProperties(tmpMessage.Properties); 

     return newMessage; 
    } 

}

+1

Parece que .ToString() que se llama en el cuerpo ... ¿Qué – Iain

+0

ConvertToXDocument parece? quizás está llamando a xdr.ToString() – Iain

+0

¿Hay algún problema con ToString()? Tiene razón ToString se llama en ConvertToXDocument. XDocument ConvertToXDocument (XmlDictionaryReader xdr) { XNode xn = XNode.ReadFrom (xdr); cadena s = xn.ToString(); return XDocument.Parse (s); } – dhinesh

Respuesta

14

El problema era que el cuerpo newMessage no se muestra en la ventana de inspección después de hacer ToString()

crear la copia buffer del mensaje que se mostrarán en el depurador

MessageBuffer messageBuffer = newMessage.CreateBufferedCopy(int.MaxValue); 
Message message = messageBuffer.CreateMessage(); 

por lo que no hay problema en el código. Es sólo que el depurador no está mostrando el cuerpo del mensaje como se menciona en el siguiente enlace

http://msdn.microsoft.com/en-us/library/ms734675(v=VS.90).aspx

en el Acceso al cuerpo del mensaje para la sección de depuración.

1

sospecho ToString devolverá lo que está recibiendo. ToString a menudo se usa para la depuración y, por lo tanto, solo muestra información básica sobre el objeto. Que tiene que hacer algo como esto en ConvertToXDocument:

XDocument x = XDocument.Load(xdr); 
+0

ToString() devuelve el cuerpo correctamente. XDocument.Load (xdr); arroja alguna excepción "El estado de XmlReader debe ser EndOfFile después de esta operación". Mientras se depura la variable xd devuelve el valor apropiado, sin embargo, después de EmitTags() algo va mal. – dhinesh

+1

Extraño ... quizás no todo es lo que parece. Tal vez solo * pienses * que el contenido del mensaje es incorrecto porque así es como lo informa el depurador, cuando en realidad está bien – Iain

+0

¿Entonces está bien una vez que se termine EmitTags? – Iain

15

Aquí está la solución: si llama Message.ToString() que conseguirá

..stream ..

usar en su lugar System.Xml.XmlWriter. Este es un ejemplo:

MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue); 
Message msg = buffer.CreateMessage(); 
StringBuilder sb = new StringBuilder(); 
using (System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(sb)) 
{ 
    msg.WriteMessage(xw); 
    xw.Close(); 
} 
Console.WriteLine("Message Received:\n{0}", sb.ToString()); 
Cuestiones relacionadas