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 MVCEntity 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 StudioFTP 模式)发布网站。

发布后,我从浏览器调用一个单独的/通用/公共页面(例如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 预编译花费大量时间

在 ASP.NET MVC 中构建 CMS

ASP.NET MVC MapRoute超过1个参数问题

如何使用ASP.NET MVC增加对AJAX JSON响应的2MB限制

ASP.NET MVC 6 使用 IIS 开发无需发布