Использование маршрутизации с веб-формами - CreateInstanceFromVirtualPath иногда очень медленный - PullRequest
2 голосов
/ 10 сентября 2010

Я использую маршрутизацию с моим приложением ASP.NET WebForms, используя технику, описанную Филом Хааком:

Это хорошо работает большую частьоднако время от времени первый вызов System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath занимает десятки секунд для возврата.

Это происходит следующим способом:

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    LapTimer lapTimer = new LapTimer();

    string virtualPath = this.GetSubstitutedVirtualPath(requestContext, lapTimer);
    if (this.CheckPhysicalUrlAccess && !UrlAuthorizationModule.CheckUrlAccessForPrincipal(virtualPath, requestContext.HttpContext.User, requestContext.HttpContext.Request.HttpMethod))
        throw new SecurityException();

    IHttpHandler page = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)) as IHttpHandler;
    if (page != null)
    {
        //Pages that don't implement IRoutablePage won't have the RequestContext
        //available to them. Can't generate outgoing routing URLs without that context.
        var routablePage = page as IRoutablePage;
        if (routablePage != null)
            routablePage.RequestContext = requestContext;
    }

    return page;
}

В то же время, что и этот Iобратите внимание (используя диспетчер задач), что процесс с именем csc.exe , компилятор C #, занимает 10% -50% моего процессора.

Кто-нибудь может подсказать, почему это происходит?

1 Ответ

2 голосов
/ 10 сентября 2010

Ваше приложение использует компиляцию представлений во время выполнения.В то время как ваша бизнес-логика, codebehind и т. Д. (В основном любой файл .cs) компилируется Visual Studio, ваши представления (* .aspx, * .ascx, * .Master) компилируются средой выполнения asp.net при первом запросе данного представления.(т.е. у BuildManager запрашивается объект, соответствующий заданному виртуальному пути).Это может занять некоторое время, потому что представления могут быть скомпилированы партиями (например, все представления в одной папке).

Представление будет перекомпилировано, если вы измените его.Также все компиляции представлений будут признаны недействительными, если домен приложения перезапустится (что может произойти, если вы внесете изменения в web.config, global.asax и т. Д.).

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

...