c# MVC 站点地图 - 使用角色时非常慢 - 非常慢

2024-03-14

我已经安装了适用于 MVC5 的 MVC 站点地图提供程序,并且使用了开箱即用的所有内容。效果很好。现在我想实现基于角色的菜单修剪,所以假设我的控制器:

public class Home: Controller
{

    [Authorize(Roles="Admin")]
    public ActionResult Index()
    {
        return View();
    }
}

现在基本上只有管理员角色用户才能看到菜单。完美,效果很好。

为了实现这一点,我在 web.config 中添加了这一行:

  <add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true" />

问题是它可以工作,但速度很慢。页面加载大约需要 7 秒。如果我删除 web.config 行,基本上会删除基于角色的菜单修剪,则页面加载大约需要 300 毫秒。这里出了点问题。

知道为什么我基于角色的菜单修剪速度很慢吗?我没有做过任何定制。


安全调整功能依赖于创建控制器实例every节点以确定当前用户上下文是否具有访问权限。

造成这种缓慢的最可能原因是您的控制器(或其基类)在构造函数中进行了太多繁重的处理。

public class HomeController
{
    public HomeController() {
        // Lots of heavy processing
        System.Threading.Thread.Sleep(300);
    };
}

上面的示例将在页面中为代表操作方法的每个节点增加 300 毫秒的页面加载时间。HomeController。如果您的其他控制器在实例化期间也有繁重的处理,它们也会为每个页面加载增加额外的时间。

当遵循 DI 最佳实践时,这不是问题,因为在创建控制器实例后,外部服务中会进行大量处理。

public interface IHeavyProcessingService
{
    IProcessingResult DoSomethingExpensive();
}

public class HeavyProcessingService : IHeavyProcessingService
{
    public HeavyProcessingService() { 
    }

    public IProcessingResult DoSomethingExpensive() {
        // Lots of heavy processing
        System.Threading.Thread.Sleep(300);
    }
}

public class HomeController
{
    private readonly IHeavyProcessingService heavyProcessingService;

    // The constructor does no heavy processing. It is deferred until after
    // the instance is created by HeavyProcessingService. 
    // The only thing happening here is assignment of dependencies.
    public HomeController(IHeavyProcessingService heavyProcessingService) {

        if (heavyProcessingService == null)
            throw new ArgumentNullException("heavyProcessingService");

        this.heavyProcessingService = heavyProcessingService;
    };

    public ActionResult Index()
    {
        var result = this.heavyProcessingService.DoSomethingExpensive();

        // Do something with the result of the heavy processing

        return View();
    }

    public ActionResult About()
    {
        return View();
    }

    public ActionResult Contact()
    {
        return View();
    }
}

请注意,在上面的示例中,构造函数中没有发生繁重的处理?这意味着创建一个实例HomeController很便宜。这也意味着不需要进行繁重处理的操作方法(如About() and Contact()在示例中)不会受到所需的繁重处理的影响Index().

如果不使用 DI,MVC 仍然要求为每个请求创建一个新的控制器实例(控制器实例永远不会在用户或操作方法之间共享)。不过,在这种情况下,每个用户的情况并不那么明显,因为每个用户仅创建 1 个实例。基本上,MvcSiteMapProvider由于您的应用程序预先存在问题(您现在可以修复),速度正在减慢。

即使您不使用 DI,最好的做法仍然是将繁重的处理推迟到创建控制器实例之后。

public class HomeController
{
    private readonly IHeavyProcessingService heavyProcessingService;

    public HomeController() {

        this.heavyProcessingService = new HeavyProcessingService();
    };

    public ActionResult Index()
    {
        var result = this.heavyProcessingService.DoSomethingExpensive();

        // Do something with the result of the heavy processing

        return View();
    }
}

但是,如果无法将繁重的处理转移到应用程序中的外部服务中,您仍然可以通过将处理转移到另一种方法中来推迟处理,直到需要时为止,这样创建控制器实例的成本就不会太高。

public class HomeController
{
    public HomeController() {
    };

    private IProcessingResult DoSomethingExpensive() {
        // Lots of heavy processing
        System.Threading.Thread.Sleep(300);
    }

    public ActionResult Index()
    {
        var result = this.DoSomethingExpensive();

        // Do something with the result of the heavy processing

        return View();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c# MVC 站点地图 - 使用角色时非常慢 - 非常慢 的相关文章

  • matplotlib 条形图黑色 - 如何删除条形边框

    我正在使用 pyplot bar 但我绘制了很多点 以致条形的颜色始终为黑色 这是因为条形的边框是黑色的 而且条形数量太多 以至于它们都挤在一起 所以您看到的只是边框 黑色 有没有办法删除栏边框以便我可以看到预期的颜色 Set the ed
  • 将日期字符串转换为时间戳以按亚秒精度排序

    我有一个专栏date在 pySpark 数据框中 日期格式如下 2018 02 01T13 13 12 023507 我想将该列中的日期从字符串转换为时间戳 或者我可以根据日期对其进行排序的内容 到目前为止 我已经尝试过以下方法 new d
  • 删除 Airflow Scheduler 日志

    我正在使用 Docker Apache Airflow 版本 1 9 0 2 https github com puckel docker airflow https github com puckel docker airflow 调度程
  • 使用 byte[] 读取大文件会出现错误[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中对大文件 超过 2GB 进行哈希 SHA1 https stackoverflow com questions 6094306 hash sha1 large files over 2gb
  • .NET 中的时间跨度相乘

    如何在 C 中乘以 TimeSpan 对象 假设变量duration is a TimeSpan http msdn microsoft com en us library system timespan aspx 例如我想要 durati
  • 鼠标悬停在图像上带有文本的 DIV

    好吧 首先 这真的非常类似于http dribbble com http dribbble com主页 以最简单的形式 我有一个图像 我正在尝试对其进行 CSS 处理 以便当我将鼠标悬停在图像上时 会显示一个 DIV 其中包含一些文本和部分
  • 为什么 SpeechRecognizer 突然停止工作?

    我的 Android 应用程序 Xamarin 使用语音识别 这在 Android 8 11 和 12 的智能手机上运行良好 几周以来 我的应用程序的语音识别已停止在 Android 11 上运行 测试了 2 种不同的智能手机 在Andro

随机推荐

  • 如何在 sympy 中求解简并方程组

    我有很多方程组 其中一些未指定 我想找到一个非零解 如果存在 或报告不存在 然而 sympy 似乎在试图找到所有解决方案时停滞不前 这是一个极端的例子 from sympy import A Matrix 0 0 0 0 0 0 0 0 0
  • 确定是否有任何双精度组合从设定总和到目标值

    我在工作中遇到一个问题 让我有点困惑 我需要验证给定的药物剂量可以由药丸剂量大小的任意组合构成 例如 dose 400 0 sizes 15 0 30 0 45 0 400 不能由这些值的任何总和创建 至少我认为这是真的 但是 如果变量更改
  • Java Swing - 半透明组件

    我最近问了一个关于半透明组件因看似未正确更新而导致奇怪的工件的问题 我收到的答案导致伪像消失 但以半透明为代价 解决方案是 对于每个半透明组件 也调用 setOpaque false 函数 这样 Swing 知道它需要重绘这些组件后面的背景
  • 如何在 shell 脚本中将文件作为 stdin 传递

    我有一个 bash 脚本 当像这样调用时可以工作 stats sh rows test file 该程序主要计算行平均值和中位数以及列平均值和中位数 现在对于程序 我想将文件作为标准输入传递 但是当我运行这段代码时它会打印 you have
  • Python 请求没有给我提供与浏览器相同的 HTML

    我正在使用 Python 请求抓取 Wikia 页面 但有一个问题 requests 请求没有给我相同的 HTML因为我的浏览器具有完全相同的页面 为了比较 这是 Firefox 给我的页面 https www dropbox com s
  • python在哪里存储全局变量和局部变量?

    和问题几乎一样本地 全局 静态 自动 寄存器 外部 常量 易失性变量存储在哪里 https stackoverflow com questions 3684760 where the local global static auto reg
  • Vuejs v-model 特殊字符

    你能用 v model 转义特殊字符吗 我在编辑从数据呼叫中收到的文本时遇到了问题 编辑时 this 在文本区域中显示为 this 我知道 v html 但是你能将它与 v model 一起使用吗 如果没有 还有什么选择 v model作品
  • 将动态生成的 GridView 放入 ASP.Net C# 中的特定

    我在 C 的代码隐藏文件中创建了 gridview 我想将该 gridview 放入特定的 div 源文件的 我生成网格的代码是 using System using System Collections Generic using Sys
  • 仅从一个 div 中获取选定的文本

    我有一个包含许多表格和 div 的页面 其中一张带有一些文字 页面在此 div 后还有一个 url 需要 如果用户从 div id comment 中选择文本 div 内的文本以及此 div 中的另一个 div 内的文本 则在按 url 后
  • VScode远程连接错误:进程尝试写入不存在的管道

    我使用vscode和remote ssh连接我的服务器 配置后 我想连接我的主机 但失败了 对话框显示 无法建立与XX的连接 进程试图写入不存在的管道 output 16 45 20 916 Log Level 3 16 45 20 936
  • 如何将 python 中的命令行参数转换为字典?

    我正在编写一个应用程序 它接受任意命令行参数 然后将它们传递给 python 函数 myscript py arg1 1 arg2 foobar arg1 4 然后在 myscript py 中 import sys argsdict so
  • python ssl eof 发生违反协议、wantwriteerror、zeroreturnerror

    我正在使用 gevent 为池运行许多 celery 任务 20 000 也用猴子修补所有任务 这些任务中的每一个都会调用 adwords 等第三方服务来提取数据 由于潜在的 SSL 错误 我的任务不断失败 下面是一些异常的堆栈跟踪 排名不
  • 正则表达式从捕获中排除匹配项

    在 Net 中使用正则表达式 我将有一组类似这样的数据 lt Bunch o Data Here gt where lt 只是新记录的指标 gt 是记录的结尾 这些记录可能会像这样出现 lt Dataset 1 gt
  • C++ 矢量数学和 OpenGL 兼容

    我一直在做很多矢量数学的工作 并为其编写了自己的模板 我的要求是大量的向量数学 加法 减法 缩放 叉乘和点积 而且我需要能够将我的向量作为 float 传递 以便 openGL 可以使用它 我已经很高兴地使用这个有一段时间了 今天一位讲师看
  • Codeigniter:如何获取文件的文件名

    我是 Codeigniter 新手 我正在尝试获取上传图像的文件名 以便将其保存在数据库中 我有两个模型 homemodel 处理我的数据库 image upload model 处理图像上传 一切正常 除了我不知道如何将图像文件名发布到数
  • 如何在 Xcode 5 中的 Storyboard 上抑制约束和布局警告?

    是否有任何标志可以抑制 Xcode 5 中故事板的不明确布局或错误放置的视图 我在代码中添加约束 并且只是使用 Interfacebuilder 中的视图作为虚拟对象 我不想应用 Xcode Resolve 自动布局问题 因为我很高兴视图在
  • 当我登录 Azure 门户时,Azure Function 计时器运行两次

    我在 Azure 中有一个定时函数应用程序 计划在每天 22 00 运行 然而 它似乎每天都在 21 59 和 22 00 运行 当我登录 Azure 门户检查日志时 它似乎也是随机运行的 以下是我收到的重复条目的时间戳示例 我在网上搜索过
  • ASP.Net MVC 应该为每个视图创建一个模型吗?

    我对 ASP Net MVC 相当陌生 我发现自己为每个视图制作一个模型类 例如 SignInModel SignUpModel EditProfileModel 等 其中许多都有些相似 具有相同的数据库文件 然后还有一些自定义属性 这真的
  • PyInstaller 无缓冲 stdio

    Problem Docker 镜像大小通常应尽可能小 使用成熟的环境 例如标准蟒蛇 https hub docker com python 安装了所有依赖项后 图像通常会导致图像严重膨胀 将 python 打包成独立的可执行文件 例如使用
  • c# MVC 站点地图 - 使用角色时非常慢 - 非常慢

    我已经安装了适用于 MVC5 的 MVC 站点地图提供程序 并且使用了开箱即用的所有内容 效果很好 现在我想实现基于角色的菜单修剪 所以假设我的控制器 public class Home Controller Authorize Roles