ASP.NET MVC 怎么能花费超过 10 秒来加载(第一次)一个空白控制器?
Posted
技术标签:
【中文标题】ASP.NET MVC 怎么能花费超过 10 秒来加载(第一次)一个空白控制器?【英文标题】:How can ASP.NET MVC takes more than 10 Seconds to load (for the first time) a blank Controller? 【发布时间】:2018-08-24 12:17:33 【问题描述】:我正在管理一个ASP.NET MVC
应用程序,该应用程序(基本上)使用.NET MVC
和Entity Framework
。我注意到每次发布网站时,每次加载(第一次)Controller/Action
都需要很长时间(大约 10-15 秒)。
我以为是Entity
的问题,所以我创建了一个空白TestController/Index
并放置一个简单的View
代码:
// Controller
public class TestController : Controller
public ActionResult Index()
return View();
// View Index.cshtml
test page controller Page generated in @((DateTime.UtcNow - HttpContext.Current.Timestamp.ToUniversalTime()).TotalSeconds.ToString("F4")) seconds
比我使用Visual Studio
(FTP
模式)发布网站。
发布后,我从浏览器调用一个单独的/通用/公共页面(例如Home/Index
),第一次尝试“加载/构建”应用程序;由于构建等原因,它确实需要一些时间,但这很好)。
现在:当我尝试加载那个空的 TestController
时,仍然需要很多时间:
这怎么可能?它是否单独编译每个控制器?所以每次我加载一个新的控制器(在发布网站或重新启动池之后)都会花费这么多时间?我想我错了……
我第二次加载它(以及以下)非常快:
我该如何解决这个问题?问题出在哪里?
请注意 - 这是我的Global.asax
,不应该刻字:
public class MvcApplication : System.Web.HttpApplication
protected void Application_Start()
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
HttpCookie authCookie = Request.Cookies["CookieFA"];
if (authCookie != null)
FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
CustomPrincipal principal = new CustomPrincipal(authTicket.Name);
CustomPrincipalSerializeModel userSerializeModel = JsonConvert.DeserializeObject<CustomPrincipalSerializeModel>(authTicket.UserData);
principal.UserID = userSerializeModel.ID;
principal.FirstName = userSerializeModel.FirstName;
principal.LastName = userSerializeModel.LastName;
principal.Roles = userSerializeModel.RoleName.ToArray<string>();
HttpContext.Current.User = principal;
【问题讨论】:
了解一些基本的 ASP.NET 调试技巧blogs.msdn.microsoft.com/tess/tag/performance-issues-and-hangs,很容易知道发生了什么。 这里有很多关于 mvc 应用程序预热的问题。看看这个 ttps://***.com/a/47169875/187365 @Fran:即使我使用IProcessHostPreloadClient
,我在里面写什么?我需要手动实例化所有控制器吗? :O
IProcessHostPreloadClient 用于预加载您可能希望在应用程序启动时可用的数据。这是ink。对于 IIS 7.5 和 8.0,您还可以使用 Application Initialization Module
【参考方案1】:
发生这种情况是因为 .NET 在第一个请求中构建了与您的操作相关的视图,这是第一个请求缓慢而下一个请求更快的原因。为了改进它,您可以与应用程序一起构建视图,存在一些可以为您做的扩展:
https://www.nuget.org/packages/RazorGenerator.Mvc/ https://www.nuget.org/packages/RazorGenerator.MsBuild/
您可以在 RazorGenerator GitHub 页面中阅读有关如何使用这些扩展程序的更多信息。
【讨论】:
以上是关于ASP.NET MVC 怎么能花费超过 10 秒来加载(第一次)一个空白控制器?的主要内容,如果未能解决你的问题,请参考以下文章
在 asp.net mvc 应用程序中检索大量行(超过 1000 万)
ASP NET MVC 4 Razor Views 预编译花费大量时间