2010-11-05 11 views
9

Próbujesz użyć MessageInspector do zmodyfikowania komunikatu przed usługą wcf za pośrednictwem serwera proxy. Jednak podczas debugowania treść wiadomości nie jest kopiowana, a treść ciała jest wyświetlana. Jaki jest problem z kodem?Treść komunikatu WCF pokazująca <s:Body> ... strumień ...</s:Body> po modyfikacji

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

Wygląda .ToString() jest wywoływana na ciele ... – Iain

+0

Co ConvertToXDocument wyglądać? może to wywołanie xdr.ToString() – Iain

+0

Czy jest jakiś problem z ToString(). Masz rację ToString jest wywoływany w ConvertToXDocument. XDocument ConvertToXDocument (XmlDictionaryReader xdr) { XNode xn = XNode.ReadFrom (xdr); ciąg s = xn.ToString(); return XDocument.Parse (s); } – dhinesh

Odpowiedz

14

Problem polegał na tym, że ciało newMessage nie został pokazany w oknie zegarka po zrobieniu toString()

stworzył buforowane kopia wiadomości mają być pokazane w debugerze.

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

Więc nie ma Nie ma problemu w kodzie. To jest po prostu, że debugger nie jest wyświetlana treść wiadomości, jak wspomniano w linku poniżej

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

w Otwieranie Treść wiadomości do sekcji debugowania.

1

Podejrzewam ToString zwróci to, co otrzymujesz. ToString jest często używany do debugowania, a zatem pokazuje tylko podstawowe informacje o obiekcie. Musisz zrobić coś takiego w ConvertToXDocument:

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

ToString() zwraca poprawnie ciało. XDocument.Load (xdr); rzuca pewien wyjątek "Stan XmlReader powinien być EndOfFile po tej operacji." Podczas debugowania zmienna xd zwraca wartość proprent, jednak po EmitTags() coś idzie źle. – dhinesh

+1

Dziwne ... może wszystko nie jest takie, jak się wydaje. Może tylko * myślisz * treść wiadomości jest błędna, ponieważ tak właśnie zgłasza się debugger, kiedy w rzeczywistości jest ok – Iain

+0

Więc jej ok raz EmitTags jest zrobione? – Iain

15

Oto rozwiązanie: jeśli zadzwonisz Message.ToString() dostaniesz

..stream ..

Zamiast używać System.Xml.XmlWriter. Oto przykład:

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