在C#中是否可以缓存HandleUnknownAction()重写的输出

本文关键字:重写 输出 HandleUnknownAction 缓存 是否 | 更新日期: 2023-09-27 18:27:36

嗨,谢谢你的光临!

背景

C#,.NET 4.0,MVC,当前在localhost上以调试模式运行。

问题

是否可以缓存HandleUnknownAction()重写的结果?

我正在尝试这样做,但它似乎没有缓存任何内容。

这里有一个例子:

[OutputCache(Duration = 600, Location = OutputCacheLocation.Server, VaryByParam = "actionName")]
protected override void HandleUnknownAction(string actionName)
{    
     View("SomeView").ExecuteResult(ControllerContext);    
}

在C#中是否可以缓存HandleUnknownAction()重写的输出

我认为你做不到,原因如下:如果你在OutputCacheAttribute类上引用MSDN文档(这里),你可以看到定义,因为它缓存了操作方法的输出。在这种情况下,Controller.HandleUnknownAction()方法返回void,因此没有输出到缓存

所以,不幸的是,我不认为它是这样工作的。

我遇到了同样的问题,发现我可以使用类似于MVC OutputCacheAttribute实现的方法。

我已经确认,正确的缓存头与响应一起发送,并且在缓存未命中之后,HandleUnknownAction在输出缓存到期之前不会被调用。

protected override void HandleUnknownAction(string actionName)
{
    var Result = View(...);
    using (var Page = new OutputCachedPage(ControllerContext, Result))
    {
        Page.ProcessRequest(HttpContext.ApplicationInstance.Context);
    }
}
class OutputCachedPage : Page
{
    readonly ControllerContext ControllerContext;
    readonly ActionResult Result;
    public OutputCachedPage(ControllerContext controllerContext, ActionResult result)
    {
        if (controllerContext == null) throw new ArgumentNullException("controllerContext");
        if (result == null) throw new ArgumentNullException("result");
        ControllerContext = controllerContext;
        Result = result;
    }
    protected override void FrameworkInitialize()
    {
        base.FrameworkInitialize();
        InitOutputCache(new OutputCacheParameters
            {
                Enabled = true,
                Duration = 600,
                Location = OutputCacheLocation.Any,
                VaryByParam = "*"
            });
    }
    protected override void Render(HtmlTextWriter writer)
    {
        Result.ExecuteResult(ControllerContext);
    }
}

请注意,类似的方法可以在ActionFilterAttribute中使用,以在其他场景中提供更复杂的输出缓存行为(例如,在设置的时间间隔(如:00、:15、:30、:45分钟)过期的缓存配置文件)。