我正在使用MvcSiteMapProvider Html Helper来创建导航栏。导航栏的内容取决于访问者权限,因此我使用安全修整来仅显示该人员被授权的内容。为了提高性能,我试图缓存此导航栏。
导航栏在局部视图中创建,其中包含以下内容:
@Html.MvcSiteMap().Menu("MenuHelper", new { name = "MainMenu" })
在布局文件中,它由一个返回局部视图的动作方法调用:
[System.Web.Mvc.OutputCache(Duration = 10, VaryByCustom = "User")]
[ChildActionOnly]
public ActionResult MainMenu()
{
return PartialView("MainMenu");
}
在站点地图的根页面上缓存工作正常。但是,当缓存持续时间用完并且从更深层次调用操作方法时,不会返回任何站点地图。 当我禁用安全修整或输出缓存时,它在所有级别都可以正常工作。
当授权数据不可用时,是否可能会调用返回导航栏的操作方法,从而返回损坏的站点地图?
答案 0 :(得分:0)
如果您分析source for AuthorizeAttribute
,您会注意到它不适用于输出缓存的子操作(它们会花很多时间来确保child actions that are output cached will throw an exception)。
当然,如果您的自定义AuthorizeAttribute
覆盖OnAuthorization
并且不会复制此重要逻辑,那么它也无法正常工作。
但是,使用安全修整时,您可以采取以下措施来提高性能:
MvcSiteMapProvider
,但安全修整会使这一点变得更加明显)。AuthorizeAttribute
,则可以使用roles
属性/属性将您的角色逻辑复制到SiteMap中并删除{ {1}}来自您的配置(仅限外部DI)。有关详细信息,请参阅{{3}}。