MVC:应该覆盖哪个方法来缓存操作结果

时间:2011-03-17 01:52:13

标签: c# asp.net-mvc

我正准备参加微软证书考试(70-515),阅读微软本书考试,练习考试...一个考试要求:

  

您正在创建自定义MVC操作过滤器以缓存操作结果。

     

您应该覆盖哪种虚拟方法?

正确答案(根据测试程序,随书分发)是“OnResultExecuting”

答案的解释:

  

通过继承ActionFilterAttribute类创建自定义操作筛选器时,可以覆盖以下列顺序运行的四个虚拟方法:OnActionExecuting(),OnActionExecuted(),OnResultExecuting()和OnResultExecuted()。对于输出缓存,您希望捕获最终的渲染结果。因此,您应该覆盖要运行的最后一个方法:OnResultExecuting()。

这是不一致的:如果我们需要覆盖LAST提到的方法,那么它应该是“OnResultExecuted”。但作为回答,它被告知“OnResultExecuting”。

所以问题是:

  1. 什么是覆盖的CORRECT方法?
  2. 我应该在考试中选择哪个选项才能将答案视为正确? (问题适用于“正确”答案实际上与系统建议不同的情况。
  3. 感谢。

    P.S。我不确定当前的问题是否属于SO,但至少它非常接近

5 个答案:

答案 0 :(得分:6)

经过一段时间后我才有所了解:你应该覆盖'OnResultExecuting'方法,以检查你是否已经缓存了结果。如果“是”你将从缓存中获取它,如果不是,你将真正执行“执行”部分的功能,然后将其放入缓存。

答案 1 :(得分:3)

最好的方法是查看source for the built in OutputCacheAttribute。它的主要内容是:

public override void OnResultExecuting(ResultExecutingContext filterContext) {
    if (filterContext == null) {
        throw new ArgumentNullException("filterContext");
    }

    // we need to call ProcessRequest() since there's no other way to set the Page.Response intrinsic
    OutputCachedPage page = new OutputCachedPage(_cacheSettings);
    page.ProcessRequest(HttpContext.Current);
}

private sealed class OutputCachedPage : Page {
    private OutputCacheParameters _cacheSettings;

    public OutputCachedPage(OutputCacheParameters cacheSettings) {
        // Tracing requires Page IDs to be unique.
        ID = Guid.NewGuid().ToString();
        _cacheSettings = cacheSettings;
    }

    protected override void FrameworkInitialize() {
        // when you put the <%@ OutputCache %> directive on a page, the generated code calls InitOutputCache() from here
        base.FrameworkInitialize();
        InitOutputCache(_cacheSettings);
    }
}

所以他们通过覆盖OnResultExecuting来实现它。我个人不明白为什么你会等那么久......因为请求处理所需的大部分时间都在action方法中,包含所有服务,存储库和任何调用?否?

也许比我更聪明的人可以解释。

答案 2 :(得分:1)

老实说,我不同意这种做法。我个人认为,我会自己重写OnActionExecuting和OnResultExecuted。仅覆盖OnResultExecuted并没有什么好处,因为在应用过滤器之前您已经执行了action方法。您希望在执行操作之前拦截请求并在OnActionExecuting中返回输出缓存,并且您希望捕获OnResultExecuted中的最终结果。

答案 3 :(得分:1)

请记住,MVC内置了[OutputCache]属性,可以为您处理输出缓存:http://www.asp.net/mvc/tutorials/improving-performance-with-output-caching-cs。对于实际开发,这可能是比构建自定义缓存属性更好的方法。

答案 4 :(得分:0)

约定说(关于事件/事件执行方法):渐进形式=在执行命名动作之前,过去时态=在它发生之后。所以正确答案应该是OnResultExecuted

但是,我建议您联系microsoft并要求澄清。