Обзор:
Эта статья основана на исходном коде ASP.NET 2.0 и содержит краткий анализ среды выполнения ASP.NET 2.0. Надеюсь, она поможет вам понять процесс обработки запросов и модель компиляции страниц в ASP.NET 2.0.
Ключевые слова:
Среда выполнения ASP.NET 2.0, принципы, обработка запросов, компиляция страниц,
основные классы среды выполнения HTTP ASP.NET 2.0:
System.Web.HttpRuntime
System.Web.HttpApplicationFactory
System.Web.HttpApplication
System.Web.Compilation.BuildManager
System.Web.Compilation.ApplicationBuildProvider
System.Web.Compilation.BuildProvidersCompiler
System.Web.UI.PageHandlerFactory
Краткая блок-схема обработки запроса:
Рекомендации по прочтению:
Используйте инструмент Reflector для просмотра исходного кода ASP.NET 2.0 во время чтения.
анализировать:
Когда мы инициируем запрос к странице asp.net на веб-сайте ASP.NET 2.0 через браузер, IIS сначала получает запрос на стороне сервера. Когда IIS видит, что это страница asp.net, я очень рад этому. запрос не должен обрабатываться им, просто оставьте его ASP.NET ISAPI. Работа ASP.NET ISAPI также относительно проста. Его основная задача — организовать обработку запросов aspnet_wp.exe и контролировать выполнение процесса aspnet_wp.exe, если процесс aspnet_wp.exe слишком утомлен и не может выполнить задачу. что ж, ASP.NET ISAPI уволит его и заменит новым aspnet_wp.exe для выполнения этой работы.
Основная задача aspnet_wp.exe — передача запросов ряду управляемых объектов, называемых HTTP-конвейерами. Если ASP.NET ISAPI сравнивается с менеджером по продажам, то aspnet_wp.exe — это менеджер по производству, а конвейер HTTP — это производственный конвейер. За сборочную линию отвечает команда HttpRuntime. Менеджер производства aspnet_wp.exe передаст заказ (HTTP-запрос) члену группы HttpRuntime ProcessRequest (HttpWorkerRequest wr). HttpRuntime в конечном итоге будет создан на сборочной линии ProcessRequestInternal (HttpWorkerRequest wr). ) в соответствии с внутренним разделением труда, поэтому в центре нашего анализа находится ProcessRequestInternal(HttpWorkerRequest wr).
Основная работа ProcessRequestInternal:
1. Создайте экземпляр HttpContext.
2. Инициализируйте первый запрос (EnsureFirstRequestInit).
а) Выполните некоторую работу по инициализации в SureFirstRequestInit, вызвав System.Web.HttpRuntime.FirstRequestInit, например, прочитайте конфигурацию Web.Config в RuntimeConfig и загрузите все файлы DLL из каталога bin.
3. Создайте экземпляр HttpWriter.
4. Создайте экземпляр HttpApplication, вызвав HttpApplicationFactory.GetApplicationInstance.
В HttpApplicationFactory.GetApplicationInstance есть три ключевых метода:
HttpApplicationFactory._theApplicationFactory.EnsureInited();
HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(контекст);
HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context)
Давайте проанализируем эти три метода один за другим:
1) HttpApplicationFactory._theApplicationFactory.EnsureInited();
Этот метод проверяет, была ли инициализирована HttpApplicationFactory. Если нет, она инициализируется с помощью HttpApplicationFactory.Init().
В Init() сначала получите полный путь к файлу global.asax, а затем вызовите CompileApplication() для компиляции global.asax.
Как осуществляется компиляция?
Работу по компиляции завершает BuildManager. BuildManager сначала получает GlobalAsaxType (то есть HttpApplication), а затем вызывает BuildManager.GetGlobalAsaxBuildResult() =》GetGlobalAsaxBuildResultInternal() =》EnsureTopLevelFilesCompiled() для компиляции.
В SureTopLevelFilesCompiled сначала компилируется CompilationStage.TopLevelFiles, а затем компилируются файлы в следующих трех каталогах:
а.КомпилеРесаурцесДиректори();
Скомпилируйте каталог App_GlobalResources.
б. КомпилироватьWebRefDirectory();
Скомпилируйте каталог App_WebReferences.
в.КомпилироватьКодКаталоги();
Скомпилируйте каталог App_Code.
Затем скомпилируйте CompilationStage.GlobalAsax, скомпилируйте global.asax и вызовите метод: CompileGlobalAsax()=》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp).
Конкретная компиляция в GetGlobalAsaxBuildResult завершается ApplicationBuildProvider и BuildProvidersCompiler.
BuildProvidersCompiler.PerformBuild() выполняет работу по компиляции.
ApplicationBuildProvider.GetBuildResult получает скомпилированный результат.
После успешной компиляции в соответствующем каталоге C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files будет создан файл dll, аналогичный App_global.asax.mlgx7n2v.dll.
Скомпилированный класс называется ASP.global_asax и наследуется от HttpApplication.
Примечание. Если в веб-каталоге нет файла Global.asax, такие файлы, как App_global.asax.mlgx7n2v.dll, не будут скомпилированы и созданы.
2) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(контекст);
Создайте конкретный экземпляр HttpApplication, инициируйте событие ApplicationOnStart и выполните метод Application_Start(object sender, EventArgs e) в ASP.global_asax. Созданный здесь экземпляр HttpApplication перерабатывается после обработки события.
3) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(контекст);
Этот метод создает экземпляр HttpApplication и инициализирует его (вызов метода System.Web.HttpApplication.InitInternal()).
Создание экземпляра HttpApplication основано на фактическом _theApplicationType. Если в веб-каталоге нет файла global.asa, то есть нет динамической компиляции для создания типа ASP.global_asax, то создайте экземпляр HttpApplication напрямую. Если создан тип ASP.global_asax, создайте экземпляр ASP.global_asa.
После создания экземпляра HttpApplication вызовите метод InitInternal этого экземпляра.
Метод InitInternal также является методом, на котором мы фокусируемся. Основные функции этого метода следующие:
1. InitModules(): создайте соответствующие HttpModules в соответствии с настройками Web.Config.
2. HookupEventHandlersForAppplicationAndModules: в зависимости от возникшего события вызовите соответствующую функцию обработки событий в экземпляре HttpApplication.
3. Создайте множество экземпляров классов, реализующих интерфейс IExecutionStep, и добавьте их в _execSteps текущего экземпляра HttpApplication и дождитесь выполнения обратного вызова. Отсюда мы видим, что HttpApplication обрабатывает запросы асинхронно, и многие задачи обработки запросов помещаются в _execStep для ожидания выполнения обратного вызова.
Основная работа по обработке в _execStep заключается в следующем:
1) Выполните проверку безопасности запрошенного пути и запретите незаконный доступ к пути (ValidatePathExecutionStep).
2) Если UrlMappings установлен, выполните RewritePath(UrlMappingsExecutionStep).
3) Выполнять функции обработки событий, такие как: BeginRequest, AuthenticateRequest и т. д.
4) Получите HttpHandler, который обрабатывает текущий запрос. Здесь также выполняется компиляция страницы ASP.NET во время выполнения. (Мапхандлерэксекутионшап)
Эта обработка выполняется путем вызова метода System.Web.HttpApplication.MapHttpHandler.
В MapHttpHandler сначала получите соответствующий тип, реализующий IHttpHandlerFactory, из файла web.config в соответствии с адресом доступа. Для страниц asp.net по умолчанию используется PageHanlderFactory. Затем создайте экземпляр PageHandlerFactory, вызовите GetHandlerHelper, вызовите BuildManager.CreateInstanceFromVirtualPath в GetHandlerHelper для компиляции и создания экземпляра запрошенной в данный момент страницы ASP.NET (если она скомпилирована, загрузите ее непосредственно из кэша).
CreateInstanceFromVirtualPath передает задачу компиляции в BuildManager CompileWebFile() после нескольких вызовов метода. CompileWebFile получает соответствующий BuildProvider из web.config. Для файлов .aspx соответствующим BuildProvider является PageBuildProvider. Как PageBuildProvider компилирует страницы, здесь рассматриваться не будет. Если вам интересно, вы можете дополнительно изучить исходный код ASP.NET 2.0.
5) Вызовите метод .ProcessRequest соответствующего HttpHandler для обработки запроса (если он асинхронный, вызовите BeginProcessReques). (КаллХандлерExecutionStep)
6) Запишите содержимое ответа в Filter. (CallFilterExecutionStep)
5. Вызовите BeginProcessRequest экземпляра HttpApplication для асинхронной обработки запроса.
Многие из упомянутых выше действий, происходящих в _execSteps, выполняются после того, как HttpRuntime вызывает HttpApplication BeginProcessRequest, а затем вызывает ResumeSteps в BeginProcessRequest.
Среда выполнения ASP.NET 2.0 — очень сложная, трудная для понимания и важная часть ASP.NET 2.0. Изучение исходного кода среды выполнения ASP.NET 2.0 поможет нам углубить наше понимание принципов ASP.NET 2.0. Дайте нам Разработка приложений ASP.NET 2.0 приносит большую помощь. В этой статье я впервые изучаю среду выполнения ASP.NET 2.0. Она была написана, чтобы помочь мне лучше понять среду выполнения ASP.NET 2.0. Вы можете критиковать и вносить предложения по содержанию статьи.
Я считаю, что написание статей может не только улучшить навыки письма и облегчить общение, но и посредством написания статей можно прояснить свои собственные идеи, способствовать более глубокому мышлению и углубить понимание технологий. Разработчики могут отвлечься от кодирования. Написание технических статей по-прежнему очень полезно для самосовершенствования.