ASP.NET Core:使用开发环境变量时,首次加载时间非常慢

4
我的ASP.NET Core应用程序在一天内从调试开始变得非常缓慢。加载单个网站需要长达90秒的时间,在第一次请求时最多只需5-6秒即可加载。我没有做出任何可以解释这种情况的更改。我尝试了不同的方法来找出原因。看起来,减速过程始于请求。
我发现,只有在将项目选项下的环境变量设置为开发时,才会出现这种情况。为测试目的,我将其设置为生产,令人惊讶的是我的应用程序像之前一样快速。我只能找到预生成的示例部分,其中检查了变量。
if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
            DebugData.InsertIfMissing(); // This is from me and inserts some testdata in the db
        } else {
            app.UseExceptionHandler("/Home/Error");
        }

尽管我将这些行代码注释掉了,但是在设置ENVIRONMENT=Development时,我的ASP.NET Core应用程序仍然非常缓慢。我不知道为什么。我只能用这个理论来解释:ASP.NET Core,EF Core或框架的其他部分在内部检查变量并执行某些需要很长时间的操作,当处于开发环境时。

目前使用生产环境是一个可以接受的解决方法。但从长远来看,我想使用这个不错的变量来做一些只有在开发中才需要的事情,比如填充数据库测试数据。在dev-mode中可能会出现性能问题的原因是什么?

Web服务器的输出如下:

Hosting environment: Development
Content root path: C:\Dev\MyApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method MyApp.Controllers.HomeController.Index (MyApp) with arguments () - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewResultExecutor[1]
      Executing ViewResult, running view at path /Views/Home/Index.cshtml.
info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]
      User profile is available. Using 'C:\Users\MyUserName\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action MyApp.Controllers.HomeController.Index (MyApp) in 84836.6896ms

正如您所见,这不是一个启动问题,因为执行操作需要大部分时间。 但是home-controller的操作仅提供了一个简单的Razor视图,至少没有在那里创建数据库连接。

为了看到这有多慢,这里有一个使用ENVIRONMENT = Production的相同请求示例。

info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action MyApp.Controllers.HomeController.Index (MyApp) in 2728.3558ms

第二个请求,ASP.NET 已经初始化/缓存了大部分内容:

info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
  Executed action MyApp.Controllers.HomeController.Index (MyApp) in 19.3621ms

使用泛型ASP.NET/ASP.NET MVC时,我因为BrowserLink而遇到了这个问题。禁用它有所帮助。 - John Prideaux
如果在这84秒内打断调试器,堆栈跟踪是什么? - Gerardo Grignoli
@JohnPrideaux 因为在旧版ASP.NET MVC堆栈中我已经遇到过BrowserLink的问题,所以在VS中BrowserLink已被禁用。而且我还在Startup.Configure()中注释掉了app.UseBrowserLink()这一行代码,因此它应该已被禁用。但是这并没有解决问题。 - Lion
@Lion:我也遇到了同样的问题,Windows DPAPI 加密需要花费我 3~4 分钟的时间。你解决了吗? - Hoang Tran
1个回答

6
我发现这与ASP.NET Core没有直接关系。相反,在选项 > 调试 > 符号中启用了微软符号服务器:

enter image description here

这使得Visual Studio加载了所有Microsoft程序集的符号。似乎符号缓存不是持久的,因为它存储在临时文件夹中。因此,VS会定期重新加载它们,这会导致明显的性能问题。我已将其禁用,现在开发区域的速度几乎与生产环境一样快。

2
未启用,即使等待一分钟页面仍然无法加载。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接