在反序列化之前获取WCF消息正文

时间:2012-07-23 12:07:53

标签: c# wcf message

我正在实现WCF服务,该服务公开[OperationContract][XmlSerializerFormat]的方法。我有时会得到其身体不是有效XML的请求。在这种情况下,我想记录原始主体,所以我可以知道为什么它不构成有效的XML。但是,我无法从Message对象中获取它,请参阅我的尝试(通过实现IDispatchMessageInspector接口):

    public object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        request.ToString();  // "... Error reading body: System.Xml.XmlException: The data at the root level is invalid. Line 1, position 1. ..."
        request.WriteBody(...);   // Serialization Exception, also in WriteMessage and other Write* methods
        request.GetReaderAtBodyContents(...);   // Same
        HttpRequestMessageProperty httpRequest = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];  // no body in httpRequest
    }

查看监视时,request.messageData似乎包含正文 - 但这是私有成员。

如何在不尝试反序列化的情况下获取消息缓冲区?

2 个答案:

答案 0 :(得分:1)

是的,您需要custom MessageEncoder,与消息检查器(IDispatchMessageInspector / IClientMessageInspector)不同,它会看到原始字节内容,包括任何格式错误的XML数据。

然而,如何实施这种方法并非易事。您必须将标准textMessageEncoding换行为自定义binding element并调整config文件以使用该自定义绑定。

另外,您可以在我的项目中看到我是如何做到这一点的 - wrapping textMessageEncoding,记录encoder,自定义绑定elementconfig

答案 1 :(得分:0)

您可能希望了解如何实施Message Inspector

  

消息检查器是可以在其中使用的可扩展性对象   服务模型的客户端运行时和以编程方式调度运行时   或者通过配置,可以检查和更改消息   他们被收到或在被送到之前。

另一篇文章:

http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx

<强>更新

其他一些遇到此问题的人似乎已经创建了Customer Message Encoder

  

消息编码绑定元素序列化传出消息和   将其传递给运输工具,或接收序列化形式的   来自传输的消息,并将其传递给协议层if   在场,或申请,如果不在场。