我有一个服务总是返回给定参数的相同结果。所以我很自然地希望将这些结果缓存在客户端上。
有没有办法在WCF管道中引入缓存和其他效果?也许是一个自定义绑定类,可以在客户端和实际的HTTP绑定之间进行站点。
编辑:
为了清楚起见,我不是在讨论HTTP缓存。端点可能不一定是HTTP,我看的效果远远超过缓存。例如,我需要的一个效果是防止具有相同参数的多个调用。
答案 0 :(得分:0)
WCF服务可以使用HTTP标头中的Cache-Control指令来说明客户端如何它应该使用客户端缓存。有很多选项,the part of HTTP protocol。因此,您可以定义客户端可以从本地缓存中获取数据的时间长度,而不是向服务器发出请求。与所有Web浏览器一样,所有客户端实施的HTTP都将遵循说明。如果您的客户端向WCF服务器使用ajax
个请求,则相应的ajax
调用只会从本地缓存中返回数据。
此外,可以实现许多有趣的缓存方案。例如,如果将“Cache-Control”设置为“max-age = 0”(请参阅here示例),则客户端将始终通过服务器对缓存进行重新验证。通常,服务器在头部中与数据一起发送如此命名的“ETag”。 “ETag”表示MD5哈希或任何其他免费信息,如果数据被更改,将会更改这些信息。客户端将自动先前从服务器接收的“ETag”一起发送到服务器的GET请求标头内。服务器可以使用特殊回复HTTP/1.1 304 Not Modified
(而不是典型的HTTP/1.1 200 OK
响应)和回复,主体没有数据。在这种情况下,客户端可以安全地从本地缓存中获取数据。
我使用“Cache-Control:max-age = 0”另外使用Cache-Control: private
来关闭缓存代理上的数据并声明数据可以缓存,但不与其他用户共享。
如果您想了解有关HTTP标头的缓存控制的更多信息,我建议您阅读以下Caching Tutorial。
更新:如果您希望实施一些普通的purpouse缓存,则可以使用包含Microsoft Enterprise Library的Caching Application Block。 Microsoft Enterprise Library使用the source code在CodePlex上发布。作为.NET 4.0的替代方案,您可以使用System.Runtime.Caching。它不仅可以在ASP.NET中使用(参见here)
我继续建议您使用HTTP绑定和HTTP缓存(如果只能在您的环境中使用)。通过这种方式,您可以节省许多开发时间,并在最后获得更简单,可扩展且有效的应用程序。因为HTTP非常重要,所以已经实现了很多有用的东西,你可以开箱即用。缓存是功能中的一个。
答案 1 :(得分:-2)
您可以将服务代理包装到将处理缓存的自定义代码中。您甚至可以尝试使用一些动态代理或面向方面编程(拦截)。修改客户端管道应该更容易。
修改强>
类似question was asked before,你可以看到人们提供了相同的解决方案:包装器或方面(缓存块)。问题是WCF中的可扩展点期望所有扩展都是直通的 - 您修改了调用,消息,参数等,并继续进行WCF调用。但你想要的是终止调用并从缓存中返回值。
您请求的内容不适合注入WCF管道。您必须在WCF之外 - 在自定义代理或包装器中执行此操作。如果您希望为您生成代码,请编写用于代理生成的cutom工具。