Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Aspnet样板/Aspnet零速(IoC)_Asp.net Mvc_Dependency Injection_Castle Windsor_Aspnetboilerplate - Fatal编程技术网

Asp.net mvc Aspnet样板/Aspnet零速(IoC)

Asp.net mvc Aspnet样板/Aspnet零速(IoC),asp.net-mvc,dependency-injection,castle-windsor,aspnetboilerplate,Asp.net Mvc,Dependency Injection,Castle Windsor,Aspnetboilerplate,我将aspnetboilerplate/aspnetzero模板用于具有多数据库的多租户SaaS应用程序。 这使用CastleWindsor作为DI框架 我经历了非常糟糕的性能,我用dotTrace追踪到了它——它说Castle.MicroKernel是最活跃的代码 我的请求大约需要5-6秒,大部分时间在它到达控制器之前就已经过去了。(调试时) 我认为解决所有服务/控制器都很慢。我将一些依赖项(应用程序服务)从瞬态更改为PerWebRequestLifetime,但这并不影响性能 有人知道我如何

我将aspnetboilerplate/aspnetzero模板用于具有多数据库的多租户SaaS应用程序。 这使用CastleWindsor作为DI框架

我经历了非常糟糕的性能,我用dotTrace追踪到了它——它说Castle.MicroKernel是最活跃的代码

我的请求大约需要5-6秒,大部分时间在它到达控制器之前就已经过去了。(调试时) 我认为解决所有服务/控制器都很慢。我将一些依赖项(应用程序服务)从瞬态更改为PerWebRequestLifetime,但这并不影响性能

有人知道我如何才能取得更好的表现吗

在我的视图(_layoutfile)中,我调用了Layoutcontroller上的几个不同的Childactions,该控制器注入了以下服务:

     public LayoutController(
        IPerSessionCache sessionCache,
        IUserNavigationManager userNavigationManager,
        IMultiTenancyConfig multiTenancyConfig,
        ILanguageManager languageManager,
        ITenancyNameFinder tenancyNameFinder,
        TenantManager tenantManager,
        IUserLinkAppService userLinkAppService,
        UserManager userManager)
行动是

[ChildActionOnly]
    public PartialViewResult AppHeader()
    {
        var headerModel = new Areas.Mpa.Models.Layout.HeaderViewModel
        {
            LoginInformations = AsyncHelper.RunSync(_sessionCache.GetCurrentLoginInformationsAsync),
            Languages = _languageManager.GetLanguages(),
            CurrentLanguage = _languageManager.CurrentLanguage,
            IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled,
            IsImpersonatedLogin = AbpSession.ImpersonatorUserId.HasValue,
            HasLinkedAccounts = AsyncHelper.RunSync(_userLinkAppService.HasLinkedAccounts)
        };

        return PartialView("~/Views/Layout/_AppHeader.cshtml", headerModel);
    }

[ChildActionOnly]
    public PartialViewResult AppNavbar(string currentPageName = "")
    {
        var sidebarModel = new Areas.Mpa.Models.Layout.NavbarViewModel
        {        
            Menu = AsyncHelper.RunSync(() => _userNavigationManager.GetMenuAsync(MeNavigationProvider.MenuName, AbpSession.ToUserIdentifier())),
            CurrentPageName = currentPageName
        };

        return PartialView("_AppNavbar", sidebarModel);
    }

还有类似的…但是我用一个空的布局文件检查了性能,但是我的请求仍然太长

ASP.NET样板性能基准测试结果

我们创建了两个相同的简单应用程序:一个使用ABP()

其他无ABP()

旧框架

  • ASP.NET Core 1.x
  • EF Core 1.x
测试工具

我们使用jMeter进行测试

测试结果

无ABP

使用ABP

从统计数据中可以看出,ABP在默认asp.net代码的基础上增加了平均5毫秒的开销。由于此开销是CPU使用量,因此吞吐量平均相差5%


为了更好地进行比较,我们禁用了ABP的日志记录和事务(日志记录尤其会影响性能,因为它使用I/O)。默认情况下会启用其他方面、过滤器和功能。

感谢Stevens的评论:

确保您的注入构造函数是快速的。在构建对象图的过程中,您可能正在执行某种类型的I/O操作


事实上我发现,这就是问题所在。我们的一项服务在构造函数中进行了I/O操作,这非常缓慢,导致实例化它的IoC容器性能不佳。

您是否在
.cshtml
页面中注入了任何服务?它只有一个控制器吗?显示相关代码。在ViewPageBase中,我解析了IAbpSession(但我认为在生成项目时这是aspnetzero的开箱即用)并且我有一个HtmlHelperExtension LocalizedDisplayName,用于解析LocationManager var localizationManager=IocManager.Instance.Resolve();但我在方法结束时发布了它。我删除了它们,现在可能会快一点,但这也可能是巧合。DotTrace看起来是这样的:在布局cshtml中调用几个子操作会有问题吗?这是否总是解决新的LayoutController问题?请确保您的。在构建对象图的过程中,您可能正在进行某种I/O操作。您是否使用过拦截器?拦截应用程序服务或控制器可能会导致行为不当