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

时间:2012-02-02 08:08:44

标签: asp.net wcf compression

这是我们的方案(不可协商):

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

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

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

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

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

总而言之,这感觉就像是一项甚至无法完全实现的大量工作,所以我想知道是否有人可以指出在IIS中实现解压缩部分的替代方案。如果有商业产品的建议,我绝对没问题。

1 个答案:

答案 0 :(得分:0)

我认为您应该可以使用service side Message inspector

执行此操作

在AfterReceiveRequest中解压缩