我正在实现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似乎包含正文 - 但这是私有成员。
如何在不尝试反序列化的情况下获取消息缓冲区?
答案 0 :(得分:1)
是的,您需要custom MessageEncoder,与消息检查器(IDispatchMessageInspector / IClientMessageInspector)不同,它会看到原始字节内容,包括任何格式错误的XML数据。
然而,如何实施这种方法并非易事。您必须将标准textMessageEncoding换行为自定义binding element并调整config文件以使用该自定义绑定。
另外,您可以在我的项目中看到我是如何做到这一点的 - wrapping textMessageEncoding,记录encoder,自定义绑定element和config。
答案 1 :(得分:0)
您可能希望了解如何实施Message Inspector。
消息检查器是可以在其中使用的可扩展性对象 服务模型的客户端运行时和以编程方式调度运行时 或者通过配置,可以检查和更改消息 他们被收到或在被送到之前。
另一篇文章:
http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx
<强>更新强>
其他一些遇到此问题的人似乎已经创建了Customer Message Encoder。
消息编码绑定元素序列化传出消息和 将其传递给运输工具,或接收序列化形式的 来自传输的消息,并将其传递给协议层if 在场,或申请,如果不在场。