gpt4 book ai didi

c# - ASP.NET MVC 3 自定义 RouteBase 和 OutputCache

转载 作者:可可西里 更新时间:2023-11-01 09:15:47 26 4
gpt4 key购买 nike

我的自定义 RouteBase 实现和 [OutputCache] 有问题。我们有一个 CMS,其中 url 被映射到某些内容页面。每种类型的内容页面都由不同的 Controller (和不同的 View )处理。这些 url 是完全免费的,我们需要不同的 Controller ,因此“catchall”路由不可用。所以我们构建了一个自定义的 RouteBase 实现,它调用数据库来查找所有的 url。数据库知道要使用哪个 Controller 和 Action(基于内容页面类型)。

这很好用。

但是,将此与 [OutputCache] 属性结合使用,输出缓存不起作用(页面仍然有效)。我们确保 [OutputCache] 在我们的“正常”路由上工作。

调试输出缓存非常困难,我们使用它的属性,它不起作用......非常欢迎提出如何解决这个问题的想法,正确的答案也是如此!

Controller 看起来像这样:

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();
}
}

感谢您阅读到最后!

最佳答案

最后我们追踪到调用

 ... data-role="@this.FirstVisit" ...

在我们的 _Layout.cshtml

这在我们的自定义 View 页面上调用了一个属性,该属性又调用了一个始终设置 cookie 的服务。 (赞在服务中设置 cookie!,我们知道!)

如果不是星期五,在冲刺结束时,我们可能会注意到缓存破坏缓存控制:no-cache="Set-Cookie": Http header 。

我仍然不明白为什么这只会破坏我们自定义 RouteBase 实现的缓存,而不是所有页面。所有页面都使用相同的 _Layout.cshtml

关于c# - ASP.NET MVC 3 自定义 RouteBase 和 OutputCache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12423784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com