我正准备参加微软证书考试(70-515),阅读微软本书考试,练习考试...一个考试要求:
您正在创建自定义MVC操作过滤器以缓存操作结果。
您应该覆盖哪种虚拟方法?
正确答案(根据测试程序,随书分发)是“OnResultExecuting”
答案的解释:
通过继承ActionFilterAttribute类创建自定义操作筛选器时,可以覆盖以下列顺序运行的四个虚拟方法:OnActionExecuting(),OnActionExecuted(),OnResultExecuting()和OnResultExecuted()。对于输出缓存,您希望捕获最终的渲染结果。因此,您应该覆盖要运行的最后一个方法:OnResultExecuting()。
这是不一致的:如果我们需要覆盖LAST提到的方法,那么它应该是“OnResultExecuted”。但作为回答,它被告知“OnResultExecuting”。
所以问题是:
感谢。
P.S。我不确定当前的问题是否属于SO,但至少它非常接近
答案 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并要求澄清。