1

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

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

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

4

3 回答 3

2

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

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

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

您将获得的优势。

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

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

简单!

PS 如果可能,请尝试使用303 重定向

于 2013-08-12T17:59:01.973 回答
2

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

于 2013-08-06T13:30:38.040 回答
0

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

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

于 2013-08-09T21:57:17.983 回答