WCF Rest Service的POST数据透明GZIP解压缩

Oli*_*old 6 compression asp.net wcf

这是我们的场景(不可协商):

  • 使用IIS7中托管的WebHttpEndpoint通过HTTP公开WCF REST服务
  • 所有响应和POST请求数据都以JSON格式传输
  • 非WCF Web客户端
  • 我们已经在IIS7中为JSON响应激活了gzip压缩,效果很好.

由于我们正在使用更大的JSON有效负载进行发布请求,因此我们为JSON发布数据实现了客户端GZIP压缩,并将"Content-Encoding"标头设置为"gzip".不幸的是,IIS没有开箱即用.post数据以压缩形式到达WCF反序列化器,这当然会导致异常.

我已经尝试了各种扩展点来挂钩到WCF管道但是唯一有希望的解决方案(操作行为)不起作用,因为在没有WCF客户端的情况下,永远不会调用IOperationBehavior接口的ApplyClientBehavior方法.

最后,如果实现了一个HttpModule来完成工作,但由于以下警告,我对结果并不满意:

  • 虽然我能够通过将当前HttpRequest的Filter属性设置为只有解决方案一半的GZipInputStream来透明地解压缩请求数据,因为WCF坚持从请求中读取HttpRequest.ContentLength字节,对于压缩请求显然要少得多比未压缩的有效载荷
  • 出于某种奇怪的原因,微软已经阻止了改变请求的ContentLength的所有合法方式.最后,我必须修改请求的ContentLength属性的私有支持字段.这不是您想要在生产代码中做的事情.
  • Microsoft还无法读取HttpModule中的请求InputStream来计算未压缩的内容长度,这需要我们的Web客户端也传递包含未压缩内容长度的自定义头文件

总而言之,这感觉就像是一项甚至无法完全实现的大量工作,所以我想知道是否有人可以指出在IIS中实现解压缩部分的替代方案.对于商业产品的推荐,如果有的话,我会做得很好.

Ric*_*ett 0

我认为你应该能够使用服务端消息检查器来做到这一点

在 AfterReceiveRequest 中解压