【问题标题】:Getting WCF message body before deserialization在反序列化之前获取 WCF 消息正文
【发布时间】:2024-01-17 12:56:01
【问题描述】:

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

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

【问题讨论】:

    标签: c# wcf message


    【解决方案1】:

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

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

    您还可以查看我在项目中的示例 - wrapping textMessageEncoding、日志记录 encoder、自定义绑定 elementconfig

    【讨论】:

      【解决方案2】:

      更新

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

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

      【讨论】:

      • 我实现了 IDispatchMessageInspector 接口 - 现在修复了问题文本。我无法获取原始消息正文,以防它首先不是 XML...
      • 看起来您可能需要实现客户消息编码器。我已经用一些额外的信息更新了我的答案。
      最近更新 更多