Показ сообщения тела WCF... поток ...после модификации - PullRequest
13 голосов
/ 05 ноября 2010

Попытка использовать MessageInspector для изменения сообщения перед службой wcf через прокси.Однако при отладке тело сообщения не копируется, и тело показывает

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

В чем проблема с кодом?

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;
    }

}

Ответы [ 3 ]

19 голосов
/ 01 сентября 2011

Вот решение: если вы позвоните Message.ToString (), вы получите

.. поток ..

Вместо этого используйте System.Xml.XmlWriter. Вот образец:

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());
14 голосов
/ 05 ноября 2010

Проблема заключалась в том, что тело newMessage не отображалось в окне просмотра после выполнения ToString ()

Создана буферизованная копия сообщения для отображения в отладчике.

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

Так что Нет проблем в коде. Просто отладчик не показывает тело сообщения, как указано в ссылке ниже

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

в Доступ к телу сообщения для отладки.

1 голос
/ 05 ноября 2010

Я подозреваю, что ToString вернет то, что вы получаете. ToString часто используется для отладки, и, следовательно, показывает только основную информацию об объекте. Вам нужно сделать что-то подобное в ConvertToXDocument:

XDocument x = XDocument.Load(xdr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...