我有一个关于自定义的
这很有效。
但是,与[OutputCache]属性结合使用时,输出缓存不起作用(页面仍然可以访问)。我们确保[OutputCache]在我们的“普通”路由上起作用。
调试输出缓存非常困难,虽然属性存在,但却无法正常工作...如何解决这个问题的想法将非常受欢迎,正确答案也是如此!
控制器代码如下:
RouteBase
实现和[OutputCache]
的问题。
我们有一个CMS,其中URL映射到特定的内容页面。每种类型的内容页面由不同的控制器(和不同的视图)处理。这些URL完全自由,我们需要不同的控制器,因此“catch-all”路由不能使用。因此,我们构建了一个自定义的RouteBase实现,该实现调用数据库查找所有的URL。数据库知道使用哪个控制器和操作(基于内容页面类型)。这很有效。
但是,与[OutputCache]属性结合使用时,输出缓存不起作用(页面仍然可以访问)。我们确保[OutputCache]在我们的“普通”路由上起作用。
调试输出缓存非常困难,虽然属性存在,但却无法正常工作...如何解决这个问题的想法将非常受欢迎,正确答案也是如此!
控制器代码如下:
public class TextPageController : BaseController
{
private readonly ITextPageController textPageController;
public TextPageController(ITextPageController textPageController)
{
this.textPageController = textPageController;
}
[OutputCache(Duration = 300)]
public ActionResult TextPage(string pageid)
{
var model = textPageController.GetPage(pageid);
return View(model);
}
}
自定义路由的样子是这样的:
public class CmsPageRoute : RouteBase
{
private IRouteService _routeService;
private Dictionary<string, RouteData> _urlsToRouteData;
public CmsPageRoute(IRouteService routeService)
{
this._routeService = routeService;
this.SetCmsRoutes();
}
public void SetCmsRoutes()
{
var urlsToRouteData = new Dictionary<string, RouteData>();
foreach (var route in this._routeService.GetRoutes()) // gets RouteData for CMS pages from database
{
urlsToRouteData.Add(route.Url, PrepareRouteData(route));
}
Interlocked.Exchange(ref _urlsToRouteData, urlsToRouteData);
}
public override RouteData GetRouteData(System.Web.HttpContextBase httpContext)
{
RouteData routeData;
if (_urlsToRouteData.TryGetValue(httpContext.Request.Path, out routeData))
return routeData;
else
return null;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
private RouteData PrepareRouteData(ContentRouteData contentRoute)
{
var routeData = new RouteData(this, new MvcRouteHandler());
routeData.Values.Add("controller", contentRoute.Controller);
routeData.Values.Add("action", contentRoute.Action);
routeData.Values.Add("area", contentRoute.Area);
routeData.Values.Add("pageid", contentRoute.Constraints["pageid"]); // variable for identifying page id in controller method
routeData.DataTokens.Add("Namespaces", new[] { contentRoute.Namespace });
routeData.DataTokens.Add("area", contentRoute.Area);
return routeData;
}
// routes get periodically updated
public void UpdateRoutes()
{
SetCmsRoutes();
}
}
感谢您一直阅读到最后!
OutputCache
不起作用”的意思吗? - smartcaveman