Asp.net mvc Aspnet样板/Aspnet零速(IoC)
我将aspnetboilerplate/aspnetzero模板用于具有多数据库的多租户SaaS应用程序。 这使用CastleWindsor作为DI框架 我经历了非常糟糕的性能,我用dotTrace追踪到了它——它说Castle.MicroKernel是最活跃的代码 我的请求大约需要5-6秒,大部分时间在它到达控制器之前就已经过去了。(调试时) 我认为解决所有服务/控制器都很慢。我将一些依赖项(应用程序服务)从瞬态更改为PerWebRequestLifetime,但这并不影响性能 有人知道我如何才能取得更好的表现吗 在我的视图(_layoutfile)中,我调用了Layoutcontroller上的几个不同的Childactions,该控制器注入了以下服务: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,但这并不影响性能 有人知道我如何
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
为了更好地进行比较,我们禁用了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操作。您是否使用过拦截器?拦截应用程序服务或控制器可能会导致行为不当