【问题标题】:Caching compressed data from WCF on IIS在 IIS 上缓存来自 WCF 的压缩数据
【发布时间】:2013-07-25 06:00:43
【问题描述】:

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

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

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

【问题讨论】:

  • 在我早期的一个项目中,我们使用 Windows azure 缓存从 WCF 返回的数据。

标签: .net wcf iis caching output-caching


【解决方案1】:

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

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

然后编写一个单独的服务来将 ACTUAL 结果托管为具有确定性 URL 的 HTTP GET

您将获得的优势。

  1. 您可以再次使用 IIS 进行缓存(可能更快地实现缓存)
  2. 反向代理缓存也有效
  3. 您客户端的 ISP 代理缓存也可以使用
  4. 您客户端的操作系统/浏览器缓存也能正常工作
  5. 哎呀,代理甚至可以为不支持 GZIP 的客户端进行解压缩

此处描述的模式是 HTTP 重定向到规范 URL。

简单!

PS 尝试使用303 redirect if possible

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,理想情况下我不想修改客户端绑定(因为我的软件已经安装在数千台工作站上并且修改配置文件会......烦人)。
    • 检查我的答案,这应该需要零客户更改,而且它应该比这个答案更有效。多一点涉及编码它。如果您需要帮助,请联系我;)
    【解决方案3】:

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

    在这种情况下,您不能使用 IIS 压缩。

    【讨论】:

    • 不同意不能使用 IIS 压缩。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多