如何使用outputcache缓存customerror页面

时间:2015-09-08 07:31:26

标签: asp.net caching asp.net-mvc-5 memcached

如何使用outputcache缓存customerror页面?

自定义错误页面:

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="404" path="/customerror/notfound" responseMode="ExecuteURL" />
  <remove statusCode="500" subStatusCode="-1" />
  <error statusCode="500" path="/customerror/servererror" responseMode="ExecuteURL" />
</httpErrors>

customerrorcontroller:

public class CustomErrorController
{

    [OutputCache(Duration = duration, Location = OutputCacheLocation.Server, VaryByHeader = "Host", VaryByParam = "None")]
    public ActionResult NotFound()
    {
        return this.View("NotFound", this.Build());
    }

    private TestModel Build()
    {
        var model = new TestModel
                        {
                            Header = GetSiteHeaderContent(SiteId),
                            Footer = GetSiteFooterContent(SiteId),
                            Navigations = GetNavigations(),
                            SecondaryNavigations = GetSecondaryNavigation()
                        };
        return model;
    }
}

问题是该操作永远不会被缓存,尽管我在许多地方使用输出缓存并且工作正常。

注意:我正在使用Memcached。

提前致谢。

2 个答案:

答案 0 :(得分:1)

可能的方法是重定向到另一个操作并缓存它,如

public ActionResult Index()
{
    return RedirectToAction("NotFound");
}

[OutputCache]
public ActionResult NotFound()
{
    return this.View("NotFound", this.Build());
}

private TestModel Build()
{
    var model = new TestModel
                    {
                        Header = GetSiteHeaderContent(SiteId),
                        Footer = GetSiteFooterContent(SiteId),
                        Navigations = GetNavigations(),
                        SecondaryNavigations = GetSecondaryNavigation()
                    };
    return model;
}

答案 1 :(得分:0)

这是因为 ASP.NET 输出缓存仅在请求以 200 状态代码响应时起作用。

另请参阅 ASP.NET MVC OutputCache for HTTP 503 status code 中的 503 响应有类似问题。