在IIS上从WCF缓存压缩数据

时间:2013-07-25 11:12:32

标签: .net wcf iis caching output-caching

我在IIS上托管了WCF服务。响应的大小非常大,因此我需要在IIS端启用动态数据压缩(服务使用wsHttpBinding)。

在某些时候我意识到我也需要缓存压缩数据。每个对服务器的请求都是唯一的,但只返回少数可能值中的一个。这意味着我无法使用IIS缓存,因为每个请求都不同。另一方面,我无法使用WCF缓存,因为它对IIS压缩一无所知,因此我们必须反复重新压缩缓存数据。

有没有办法使用WCF / .net代码中的IIS压缩数据缓存?还有其他已知的解决方案吗?

3 个答案:

答案 0 :(得分:2)

请阅读文章:http://www.codeproject.com/Articles/53718/Extending-WCF-Part-II。希望这对你有所帮助。

答案 1 :(得分:2)

鉴于您说您的有效负载很大,我会假设额外的往返行程会增加可忽略的延迟。因此,我建议您充分利用您使用HTTP的事实。

编写一个检测到您在HTTP上的服务行为。然后,一旦确定要“返回”哪个大对象,就会拦截返回调用,并将其替换为HttpContext.Response.Redirect()

然后编写一个单独的服务来托管ACTUAL结果为HTTP GET并带有确定性网址。

您将获得的优势。

  1. 您可以再次使用IIS进行缓存(可能更快地实施缓存)
  2. 反向代理缓存也适用
  3. 您客户的ISP代理缓存也适用
  4. 您客户的操作系统/浏览器缓存也适用
  5. 哎呀,代理甚至可以为不支持GZIP的客户端进行解压缩
  6. 此处描述的模式是HTTP重定向到Canonical URL。

    Simples!

    PS尝试使用303 redirect if possible

答案 2 :(得分:0)

您可以创建自己的缓存。创建引用Dictionary的静态只读字段。使用锁定块保护字典。在字典中存储从请求值(确定结果的请求中的值)到缓存ID的映射,其中缓存id是文件名,或查找文件的其他标识符。或者,如果在内存中,实际缓存的对象或blob。所有缓存的文件或blob都将被压缩,因此您无需这样做。

在这种情况下,您无法使用IIS压缩。