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

В целях ведения журнала я хочу получить необработанный запрос, отправленный на мой веб-сервис 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.

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

Ответы [ 2 ]

2 голосов
/ 26 апреля 2009

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

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

0 голосов
/ 11 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...