3

我正在实现 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 似乎包含正文 - 但这是一个私人成员。

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

4

2 回答 2

2

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

然而,如何实现这种方法并非易事。您必须将标准textMessageEncoding包装为自定义绑定元素并调整配置文件以使用该自定义绑定。

您还可以看到我在项目中是如何做到的——包装textMessageEncoding、日志编码器、自定义绑定元素配置

于 2018-05-02T10:02:10.137 回答
-1

更新

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

消息编码绑定元素序列化传出消息并将其传递给传输,或者从传输接收消息的序列化形式并将其传递给协议层(如果存在)或应用程序(如果不存在)。

于 2012-07-23T12:10:02.587 回答