如何在WCF中获取请求的原始字节?

时间:2009-04-25 23:27:25

标签: .net wcf

出于日志记录的目的,我希望获得发送到我在WCF中实现的RESTful Web服务的原始请求。

我已经实施了IDispatchMessageInspector。在AfterReceiveRequest的实现中,如果消息的内容无效,我想吐出消息的原始字节(尤其是)。这是出于调试目的。我的服务已经完美地工作了,但是当遇到试图调用服务的客户的问题时,它通常很有帮助,以了解它们发送的是什么,即原始字节。

例如,假设不是发送格式良好的XML文档,而是将字符串“your mama”发布到我的服务端点。我想看到他们所做的就是这样。不幸的是,使用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 个答案:

答案 0 :(得分:2)

你想创作一个编码器;这会从线路中拉出字节以创建一条消息(在所有协议通道开始验证它之前等等)。

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

答案 1 :(得分:-1)

如果您只想记录消息,而不是以任何方式处理消息,那么只需启用此处详述的日志记录。

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