2012-04-16 70 views
6

我们正在使用ASP.NET MVC 3和AppFabric作为分布式缓存解决方案运行相当大的网站构建。我们已经实现了一个自定义的OutputCacheAdapter来使用我们的AppFabric集群。ASP.NET MVC为每个动作点击输出缓存

我们看到ASP.NET为每个操作调用OutputCacheProvider.Get()方法,即使该操作未用@OutputCacheAttribute修饰。

如果您使用默认的outputcacheprovider,但它运行位于单独计算机上的outputcacheprovider时,这并不是什么大问题。

回答

4

在设计上,首先检查输出缓存以获取页面的缓存副本。如果有一个缓存副本,它将被返回,并且没有进一步执行。特别是,没有控制器和控制器动作被派生,检查或执行。只有当页面没有被缓存时才会发生这种情况。

您将需要更改缓存提供程序,以便它可以快速确定是否可以缓存页面。只有当它是一个可缓存页面时,它才会去检查分布式缓存。此检查不能基于OutputCacheAttribute,因为在请求处理的这一部分期间它们不可用。相反,快速检查必须使用URL,Cookie和其他HTML标头信息。

+0

是的,这听起来像一个很好的解释。尽管如此,还是不​​能真正做到,或者接受性能损失,回到默认的OutputCacheProvider或者为URLS提供黑名单或白名单。 – TheNameless 2012-04-17 07:18:16

+1

@ TheNameless我没有自己做,但你不能得到路由参数[某种方式](http://www.scottschluer.com/creating-a-routedata-instance-from-a-url/),然后使用反射来检查控制器/操作上的属性?这并不理想,但可能仍然比网络往返更快。 – Basic 2014-08-19 20:09:45

0

您可以使用甜甜圈缓存outputcache属性,它允许您为输出缓存键定义前缀。因此,如果缓存键以自己的前缀开头,那么在自定义提供程序中只需获取/设置缓存即可。