如何在System.ServiceModel.Dispatcher.IErrorHandler中处理错误时记录http请求正文和标题

时间:2012-04-03 16:46:02

标签: wcf http

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,但我更喜欢避免它,因为它发生在客户站点上,我没有任何访问她的机器。

谢谢!

1 个答案:

答案 0 :(得分:0)

我想,我找到了一个有点复杂的解决方案。如果您需要执行我在问题中提出的问题,您需要实施MessageEncoder并通过MessageEncodingBindingElement进行安装。覆盖ReadMessage(...)中的MessageEncoder方法,您可以访问包含原始传入正文的缓冲区。