0

我正在使用 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");
}

缓存在站点地图的根页面上工作正常。但是,当缓存持续时间用完并且从更深层次调用操作方法时,不会返回站点地图。当我禁用安全修整或输出缓存时,它在所有级别都可以正常工作。

当授权数据不可用并因此返回损坏的站点地图时,是否有可能调用返回导航栏的操作方法?

4

1 回答 1

0

如果您分析 的AuthorizeAttribute,您会注意到它并非设计用于与输出缓存的子操作一起使用(它们竭尽全力确保输出缓存的子操作会抛出异常)。

当然,如果您有一个AuthorizeAttribute覆盖OnAuthorization不重复这个重要逻辑的自定义,它也不会正常工作。

但是,在使用 Security Trimming 时,您可以采取一些措施来提高性能:

  1. 确保您的注入构造函数很简单,尤其是在您的控制器上。如果您在构造函数中处理繁重,它确实会减慢速度(无论有没有MvcSiteMapProvider,但安全修剪使这一点更加明显)。
  2. 如果这还不足以改善事情并且您没有使用 custom AuthorizeAttribute,您可以使用roles属性/属性将您的角色逻辑复制到 SiteMap 并AuthorizeAttributeAclModule从您的配置中删除(仅限外部 DI)。

有关更多详细信息,请参阅此讨论

于 2015-12-16T01:29:33.487 回答