在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);
}
我认为你做不到,原因如下:如果你在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分钟)过期的缓存配置文件)。