Как я могу получить необработанные байты запроса в WCF?

Для целей ведения журнала я хочу получить необработанный запрос, отправленный моей веб-службе RESTful, реализованной в WCF.

Я уже реализовал IDispatchMessageInspector. В моей реализации AfterReceiveRequest я хочу выдать необработанные байты сообщения, даже (и особенно), если содержимое сообщения недействительно. Это нужно для целей отладки. Моя служба уже работает отлично, но часто бывает полезно при решении проблем с клиентами, которые пытаются вызвать службу, чтобы узнать, что они отправили, то есть необработанные байты.

Например, предположим, что вместо отправки правильно сформированного XML-документа они отправляют строку «ваша мама» в конечную точку моей службы. Я хочу видеть, что это то, что они сделали. К сожалению, использование MessageBuffer::CreateBufferedCopy() не будет работать, если содержимое сообщения уже не является правильно сформированным XML.

Вот (примерно) то, что у меня уже есть в моей реализации AfterReceiveRequest:

// The immediately following line raises an exception if the message
// does not contain valid XML. This is uncool because I want
// the raw bytes regardless of whether they are valid or not.
using (MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue))
{
    using (MemoryStream stream = new MemoryStream())
    using (StreamReader reader = new StreamReader(stream))
    {
        buffer.WriteMessage(stream);
        stream.Position = 0;
        Trace.TraceInformation(reader.ReadToEnd());
    }
    request = buffer.CreateMessage();
}

Я предполагаю, что мне нужно получить необработанный запрос, прежде чем он станет Message. Скорее всего, это нужно будет сделать на более низком уровне стека WCF, чем IDispatchMessageInspector.

Кто-нибудь знает, как это сделать?


person Gregory Higley    schedule 25.04.2009    source источник


Ответы (2)


Вы хотите создать кодировщик; это извлекает байты из сети для создания сообщения (до того, как все каналы протокола начнут проверять его и еще много чего).

http://msdn.microsoft.com/en-us/library/ms751486.aspx

person Brian    schedule 25.04.2009

Если все, что вы хотите сделать, это регистрировать сообщения, а не обрабатывать их каким-либо образом, просто включите ведение журнала, как описано здесь.

http://msdn.microsoft.com/en-us/library/ms730064.aspx

person Mark    schedule 10.05.2010