2010-11-05 13 views
9

Tentativo di utilizzare MessageInspector per modificare il messaggio prima del servizio wcf tramite il proxy. Tuttavia durante il debug il corpo del messaggio non viene copiato e corpo mostraCorpo del messaggio WCF che mostra <s:Body> ... flusso ...</s:Body> dopo la modifica

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

Qual è il problema con il codice?

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

Sembra .ToString() viene chiamato sul corpo ... – Iain

+0

Cosa ConvertToXDocument assomigliare? forse sta chiamando xdr.ToString() – Iain

+0

C'è qualche problema con ToString(). Hai ragione ToString è chiamato in ConvertToXDocument. XDocument ConvertToXDocument (XmlDictionaryReader xdr) { XNode xn = XNode.ReadFrom (xdr); string s = xn.ToString(); restituisce XDocument.Parse (s); } – dhinesh

risposta

14

Il problema era che il corpo newMessage non è stato mostrato nella finestra di controllo dopo aver fatto ToString()

creata la copia tamponata del messaggio che verrà visualizzato nel debugger.

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

Quindi non v'è Nessun problema nel codice. E 'solo che il debugger non sta mostrando il corpo del messaggio come indicato nel link qui sotto

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

nel Accesso al corpo del messaggio per la sezione di debug.

1

ho il sospetto ToString tornerà quello che hai trovato. ToString viene spesso utilizzato per il debug e quindi mostra solo le informazioni di base sull'oggetto. Hai bisogno di fare qualcosa di simile in ConvertToXDocument:

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

ToString() restituisce correttamente il corpo. XDocument.Load (XDR); sta lanciando qualche eccezione "Lo stato XmlReader dovrebbe essere EndOfFile dopo questa operazione." Mentre il debug della variabile xd restituisce il valore propery, tuttavia dopo l'EmitTags() qualcosa sta andando storto. – dhinesh

+1

Strano ... forse non tutto è come sembra. Forse pensi * solo * che il contenuto del messaggio è sbagliato perché è così che lo segnala il debugger, quando in realtà è ok – Iain

+0

Quindi è ok una volta che EmitTags è finito? – Iain

15

Ecco la soluzione: se si chiama Message.ToString() si otterrà

..stream ..

usare al posto System.Xml.XmlWriter. Ecco un esempio:

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()); 
Problemi correlati