Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC:应该重写哪个方法来缓存操作结果_C#_Asp.net Mvc - Fatal编程技术网

C# MVC:应该重写哪个方法来缓存操作结果

C# MVC:应该重写哪个方法来缓存操作结果,c#,asp.net-mvc,C#,Asp.net Mvc,我正在准备微软证书考试(70-515),阅读微软的考试用书,练习考试。。。有人问: 您正在创建自定义MVC操作筛选器以缓存操作结果 您应该覆盖哪个虚拟方法 正确答案(根据随书分发的测试程序)是“OnResultExecuting” 以及对答案的解释: 通过继承ActionFilterAttribute类创建自定义操作筛选器时,可以重写按以下顺序运行的四个虚拟方法:OnActionExecuting()、OnActionExecuted()、OnResultExecuting()和OnResult

我正在准备微软证书考试(70-515),阅读微软的考试用书,练习考试。。。有人问:

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

您应该覆盖哪个虚拟方法

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

以及对答案的解释:

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

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

因此,问题是:

  • 要重写的正确方法是什么
  • 我应该在考试中选择哪个选项才能得到正确的答案?(问题适用于“正确”答案实际上与系统建议的答案不同的情况
  • 谢谢

    另外,我不确定当前的问题是否属于这种情况,但至少它非常接近(与事件/事件执行方法有关):进行式=在执行指定操作之前,过去时=在它发生之后。因此正确的答案确实应该是
    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()是最后一个执行的?即使如此,使用您的方法,最后一个不是仍在…执行()吗?