2011-03-17 64 views
7

我准备给微软认证考试(70-515),阅读微软的书这门考试,练习测试......一个测试问:MVC:哪种方法应该重写缓存作用的结果

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

你应该覆盖哪个虚拟方法?

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

和解释的答案:

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

这里是不一致的:如果我们需要重写最后提到的方法,那么它应该是“OnResultExecuted”。但在回答时,它被告知“OnResultExecuting”。

所以,问题是:

  1. 什么是要覆盖一个正确的方法?
  2. 我应该在考试中选择哪个选项才能将答案视为正确? (问题是有效的情况下,当“正确”的答案其实是不同的系统提示。

感谢。

PS我不知道,如果目前的问题属于SO,但至少是非常接近

+1

我正要发布相同的问题:) – TweeZz 2011-06-27 14:14:58

+0

在我看来,在测试程序中有几个非常糟糕的问题。我一直有意在我自己的某个地方发表咆哮声。这个问题当然也让我感到失望。 – 2011-07-14 09:14:55

回答

6

经过一段时间对我来说,这是有道理的:你应该重写'OnResultExecuting'方法,以检查你是否已经结果缓存。如果“是”,您只需从缓存中获取它,如果不是,您将真正执行“执行”部分的功能,然后将其放入缓存。

+0

啊,好吧,这是有道理的。但是,在书的答案中,OnResultExecuting()是最后一个执行的语句呢?即使如此,用你的方法,是不是最后一个仍然......被执行()? – Marcel 2014-05-07 20:33:24

0

的约定说,(关于事件/事件执行方法):渐进形式=执行指定的动作之前,和过去式=事发后因此正确答案应该确实是OnResultExecuted

不过,我。会建议你联系话筒rosoft并要求澄清。

1

老实说,我不同意这种做法。我个人而言,会自行重写OnActionExecuting和OnResultExecuted。由于您在应用过滤器时已经执行了操作方法,因此它只会覆盖OnResultExecuted并没有太大作用。您希望在执行操作之前拦截请求,并在OnActionExecuting中返回输出缓存,并且您想要在OnResultExecuted中捕获最终结果。

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付诸实施。我个人不明白你为什么要等那么久......因为处理请求所花费的大部分时间将在操作方法中包含所有服务,存储库和任何调用?没有?

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

+0

请记住,此属性可以应用于修改服务器上的状态的操作,可以想象有人会返回相同的数据,尽管输出是相同的。通过获取广告,图片和类似事情的请求来收集信息并非闻所未闻。如果你阻止这个动作被调用,那就不会发生。你不想在框架级别这样做。 – 2011-04-02 01:58:23

相关问题