Как ASP.NET MVC может занять более 10 секунд, чтобы загрузить (впервые) пустой контроллер? - PullRequest
0 голосов
/ 24 августа 2018

Я управляю ASP.NET MVC приложением, которое использует (в основном) .NET MVC и Entity Framework. Я замечаю, что каждый раз, когда я публикую сайт, это занимает очень много времени (около 10-15 секунд) каждый раз, когда я загружаю (впервые) каждую Controller/Action.

Я думал, что это какая-то проблема 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 mode).

После публикации я вызываю из браузера отдельную / общую / общедоступную страницу (например, Home/Index), пытаясь «загрузить / собрать» приложение в первый раз; это действительно потребует немного времени, из-за сборки и тому подобного, но это нормально).

Теперь: когда я пытаюсь загрузить пустое TestController, это все равно занимает много времени:

enter image description here

Как это возможно? Компилирует ли он каждый контроллер отдельно? Таким образом, каждый раз, когда я загружаю новый контроллер (после публикации сайта или повторного запуска пула), это занимает такое количество времени? Наверное, я не прав ...

Второй раз, когда я загружаю его (и следующий) очень быстро:

enter image description here

Как я могу это исправить? Где может быть проблема?

Обратите внимание - это мой 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;
        }
    }
}

1 Ответ

0 голосов
/ 24 августа 2018

Это происходит из-за того, что .NET создает представление, связанное с вашим действием, в первом запросе, потому что первый запрос выполняется медленно, а следующий - быстрее. Чтобы улучшить его, вы можете построить представления вместе с приложением, существуют некоторые расширения, которые могут сделать это за вас:

https://www.nuget.org/packages/RazorGenerator.Mvc/ https://www.nuget.org/packages/RazorGenerator.MsBuild/

Подробнее о том, как использовать это расширение, вы можете прочитать на странице RazorGenerator GitHub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...