WCF大师,
你可能已经知道我找不到的答案......假设我有一些Web服务(WCF)和一个客户端应用程序(基于curl库)。服务器网站上的有时我收到了一个奇怪的错误:
OperationFormatter无法反序列化Message中的任何信息,因为Message为空(IsEmpty = true)。 System.Runtime.Serialization.SerializationException:OperationFormatter无法反序列化Message中的任何信息,因为Message为空(IsEmpty = true)。 来源:System.ServiceModel 堆栈跟踪: 在System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(消息消息,Object []参数) Rethrown为: System.ServiceModel.CommunicationException:反序列化操作“...”的请求消息体时出错。 OperationFormatter无法反序列化Message中的任何信息,因为Message为空(IsEmpty = true)。 来源:System.ServiceModel 堆栈跟踪: 在System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(消息消息,Object []参数) 在System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(消息消息,Object []参数) 在System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(消息消息,Object []参数) 在System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(消息消息,Object []参数) 在System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) 在System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) ...
在客户端站点上,我看到(在日志中)客户端发送请求并且请求不为空(有一些正文)但我想验证WCF是否从线路接收到此请求。 我怎样才能做到这一点? 理想情况下,我会在错误处理程序中记录传入请求(原始字节),如System.ServiceModel.Dispatcher.IErrorHandler,否则在某处收集数据,然后在错误发生时记录它们(服务器上的某种低级别http流量代理)侧?)。
另一种解决方案可能是在服务器站点上安装Wireshark,但我更喜欢避免它,因为它发生在客户站点上,我没有任何访问她的机器。
谢谢!
答案 0 :(得分:0)
我想,我找到了一个有点复杂的解决方案。如果您需要执行我在问题中提出的问题,您需要实施MessageEncoder
并通过MessageEncodingBindingElement
进行安装。覆盖ReadMessage(...)
中的MessageEncoder
方法,您可以访问包含原始传入正文的缓冲区。