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