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