Dus*_*sda 13 asp.net-mvc outputcache action-filter
我已将Output Caching添加到我的应用程序中的几个操作中,以便轻松提升性能.但是,这些操作还需要通过命中Redis数据库在每个请求(它是一个视图计数器)后递增一个计数器.
首先,我想我可以调整动作过滤器执行的顺序,以确保计算视图:
public class CountersAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
//increment my counter all clever like
base.OnResultExecuted(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
但那没用; 显然,OutputCacheAttribute的行为与普通的动作过滤器不同.然后我尝试实现自定义输出缓存:
public class OutputCacheWithCountersAttribute : OutputCacheAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
//straight to the source to get my headcount!
base.OnResultExecuted(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
不,也没用; 缓存操作后,操作过滤器似乎完全被忽略.游民.
所以,呃,有没有办法(没有实现自定义输出缓存提供程序),以确保我的观点被正确计算,这是干净和明智的?
VJA*_*JAI 14
该OutputCacheAttribute的方式有局限性,有一个名为自定义属性DonutOutputCache由保罗·海尔斯开发有助于克服的局限性.
它支持的一个重要功能是,您可以拥有一个可以一直调用的动作过滤器,即使动作是否标记了缓存属性.
对于前者 你希望在5秒的时间内缓存一个动作,同时你希望每次动作都使用LogThis过滤器接收请求时记录,你可以通过下面的方式实现这一点,
[LogThis]
[DonutOutputCache(Duration=5, Order=100)]
public ActionResult Index()
Run Code Online (Sandbox Code Playgroud)
从保罗,
是的,与内置的OutputCacheAttribute不同,即使从缓存中检索页面,操作过滤器也会执行.要添加的唯一警告是,您需要注意过滤器顺序.如果您的操作过滤器实现了OnResultExecuting或OnResultExecuted,那么这些方法将在所有情况下执行,但对于OnActionExecuting和OnActionExecuted,只有在过滤器在DonutOutputCacheAttribute之前运行时才会执行它们.这是由于MVC在设置filterContext.Result属性时阻止后续过滤器执行的方式,这是我们需要对输出缓存执行的操作.
我认为您不能依赖在动作或控制器上定义动作过滤器的顺序.要确保一个过滤器在另一个过滤器之前运行,您可以使用所有ActionFilterAttribute实现中存在的Order属性.没有设置order属性的任何操作,默认值为-1,这意味着它们将在具有显式Order值的过滤器之前执行.
因此,在您的情况下,您只需将Order = 100添加到DonutOutputCache属性,所有其他过滤器将在缓存过滤器之前执行.
| 归档时间: |
|
| 查看次数: |
4101 次 |
| 最近记录: |