【问题标题】:MvcSiteMap causes all my controllers to instantiateMvcSiteMap 导致我所有的控制器实例化
【发布时间】:2017-06-18 09:16:57
【问题描述】:

尝试从 MenuHelperModel 构建菜单会导致 MvcSiteMap 构建 所有 我的控制器。这可能会对性能造成很大影响。 当我依靠 [Authorize] 为控制器设置安全性时,这是唯一的方法吗?

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 mvcsitemapprovider asp.net-mvc-sitemap


    【解决方案1】:

    首先,constructors should be simple。如果在每个请求上创建控制器会减慢应用程序的速度,则表明构造函数正在做太多工作。无论如何,MVC 框架会为每个请求创建一个实例,因此这可能会比MvcSiteMapProvider 更慢。

    也就是说,还有另一种选择。您可以使用角色属性/角色属性来设置与 AuthorizeAttribute 中相同的角色。这样做的缺点是:

    1. 您必须复制整个安全方案。
    2. 您将无法使用自定义 AuthorizeAttribute。

    您可以通过创建一个动态节点提供程序来解决第一个限制,该提供程序使用反射扫描您的应用程序并将来自 AuthorizeAttribute 的角色设置为相应节点的角色。此代码在每次缓存超时时仅运行一次,因此此时有一些反射可能不会导致性能问题。

    【讨论】:

    • >无论如何,MVC 框架为每个请求创建一个构造函数实例。每个请求一个实例与每个请求每个控制器一个实例不同,但我理解你的意思。让我的构造函数更简单是我的第一步。
    • 是的。但不幸的是,对于任何想要使用AuthorizeAttribute 来检查任何不是当前请求的安全性的人,Microsoft 没有先见之明 - 你别无选择,只能模拟一个 @ 987654324@ 表示 would be 请求的对象,它需要一个控制器实例(或复制我提到的整个安全方案)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2012-03-08
    相关资源
    最近更新 更多