【问题标题】:Prevent output cache when the result is null当结果为空时防止输出缓存
【发布时间】:2020-02-15 16:14:15
【问题描述】:

在我的项目中,我使用了 OutputCache 属性,因此我的 Web 服务器不必继续下载相同的文件,但很少有一些问题由于未知原因返回 null。

因此,如果结果为 null,我不想缓存结果,是否有一种简单的方法可以做到这一点?

    [OutputCache(VaryByParam = "path", Duration = 6000)]
    public ActionResult LoadCachedFile(string path)
    {
        var result = DownloadFile(path);

        return result;
    }

【问题讨论】:

    标签: asp.net asp.net-mvc caching outputcache


    【解决方案1】:

    您必须创建一个继承自 OutputCacheAttribute 的类来覆盖

    OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
    

    方法。这是一个小示例代码:

    [System.AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
    sealed class CustomOutputCacheAttribute : OutputCacheAttribute
    {
    
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Result != null)
                base.OnActionExecuted(filterContext);
        }
    
    }
    

    【讨论】:

    • 当我返回 null 时 filterContext.Result 不是 null 而是 System.Web.Mvc.EmptyResult 对象,所以我将 if 条件更改为 if(!(filterContext.Result is EmptyResult)) 但即使在此之后它仍然无法正常工作,即使它没有调用 base.OnActionExecuted 它仍然被缓存,并且对同一 url 的下一个请求不会命中我的操作
    • 当我使用 OnResultExecuting 代替时工作
    【解决方案2】:

    我必须执行类似于 nikstffrs 建议的操作,但我没有覆盖 OnActionExecuted,而是使用了 OnResultExecuting。

    public class CustomOutputCache : OutputCacheAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            if(!(filterContext.Result is EmptyResult))
               base.OnResultExecuting(filterContext);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2011-07-05
      • 2011-10-19
      • 1970-01-01
      • 2021-12-06
      • 2010-09-26
      相关资源
      最近更新 更多