C# MVC:应该重写哪个方法来缓存操作结果
我正在准备微软证书考试(70-515),阅读微软的考试用书,练习考试。。。有人问: 您正在创建自定义MVC操作筛选器以缓存操作结果 您应该覆盖哪个虚拟方法 正确答案(根据随书分发的测试程序)是“OnResultExecuting” 以及对答案的解释: 通过继承ActionFilterAttribute类创建自定义操作筛选器时,可以重写按以下顺序运行的四个虚拟方法:OnActionExecuting()、OnActionExecuted()、OnResultExecuting()和OnResultExecuted()。对于输出缓存,您希望捕获最终渲染结果。因此,您应该重写要运行的最后一个方法:OnResultExecuting() 这是不一致的:如果我们需要覆盖最后提到的方法,那么它应该是“OnResultExecuted”。但作为回答,它被告知“OnResultExecuting” 因此,问题是:C# MVC:应该重写哪个方法来缓存操作结果,c#,asp.net-mvc,C#,Asp.net Mvc,我正在准备微软证书考试(70-515),阅读微软的考试用书,练习考试。。。有人问: 您正在创建自定义MVC操作筛选器以缓存操作结果 您应该覆盖哪个虚拟方法 正确答案(根据随书分发的测试程序)是“OnResultExecuting” 以及对答案的解释: 通过继承ActionFilterAttribute类创建自定义操作筛选器时,可以重写按以下顺序运行的四个虚拟方法:OnActionExecuting()、OnActionExecuted()、OnResultExecuting()和OnResult
OnResultExecuted
但是,我建议您与microsoft联系并要求澄清。老实说,我不同意这种方法。我个人会选择重写OnActionExecuting和OnResultExecuted。只重写OnResultExecuted没有多大好处,因为在筛选时您已经执行了操作方法将应用。您希望在执行操作之前拦截请求,并在OnActionExecuting中返回输出缓存,并且希望在OnResultExecuted中捕获最终结果。请记住有一个
[OutputCache]
为您处理输出缓存的MVC中内置的属性:。对于实际开发,这可能是一种比构建自定义缓存属性更好的方法。最好的方法是查看。它的主要核心是:
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);
}
}
public覆盖void OnResultExecuting(ResultExecutingContext筛选器上下文){
如果(filterContext==null){
抛出新ArgumentNullException(“filterContext”);
}
//我们需要调用ProcessRequest(),因为没有其他方法来设置Page.Response的内在属性
OutputCachedPage=新的OutputCachedPage(\u缓存设置);
ProcessRequest(HttpContext.Current);
}
私有密封类OutputCachedPage:第页{
私有输出缓存参数\u缓存设置;
公共OutputCachedPage(OutputCacheParameters缓存设置){
//跟踪要求页面ID是唯一的。
ID=Guid.NewGuid().ToString();
_cacheSettings=缓存设置;
}
受保护的覆盖void FrameworkInitialize(){
//当您将指令放在页面上时,生成的代码从这里调用InitOutputCache()
base.FrameworkInitialize();
InitOutputCache(_cacheSettings);
}
}
因此,他们通过覆盖ResultExecuting上的来实现它。我个人不明白为什么要等这么长时间……因为处理请求所需的大部分时间都在action方法中,包括它的所有服务、存储库和任何调用?不是吗
也许有比我聪明得多的人可以解释。对我来说,过了一段时间后,它有了一些意义:你应该重写“OnResultExecuting”方法,以检查你是否已经缓存了结果。如果“是”,你将从缓存中获取它,如果不是,你将真正执行“executing”的功能部分,然后将其放入缓存。请记住,此属性可以应用于修改服务器状态的操作,可以想象,尽管输出相同,但有人会返回相同的数据。通过get请求收集广告、图像等信息并非闻所未闻。如果您阻止该操作被调用时,这是不可能发生的。你不想在框架级别这样做。我正要发布相同的问题:)在我看来,测试程序中有几个非常糟糕的问题。我一直想自己在某个地方发表一篇关于此事的言论。这个问题当然也吸引了我。啊,好吧,这是有道理的。但是书中答案中的语句呢,OnResultExecuting()是最后一个执行的?即使如此,使用您的方法,最后一个不是仍在…执行()吗?