Общие сведения о жизненном цикле приложения ASP.NET для служб IIS 7.0

Visual Studio 2010

Обновлен: Ноябрь 2007

В данном разделе описывается жизненный цикл приложений для ASP.NET, выполняющихся в IIS 7.0 в интегрированном режиме на платформе .NET Framework 3.0 или более поздней версии. Службы IIS 7.0 также поддерживает классический режим, подобный запуску ASP.NET в службах IIS 6.0. Дополнительные сведения см. в разделе Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0.

Интегрированный конвейер IIS 7.0 представляет собой унифицированный конвейер обработки запросов, поддерживающий модули как машинного, так и управляемого кода. Модули управляемого кода, в которых реализован интерфейс IHttpModule, имеют доступ ко всем событиям в конвейере запросов. Например, модуль управляемого кода можно использовать для проверки подлинности форм ASP.NET как для веб-страниц ASP.NET (файлов с расширением ASPX), так и для страниц HTML (файлов с расширением HTM или HTML). Это имеет место даже в том случае, когда страницы HTML обрабатываются службами IIS и ASP.NET как статические ресурсы. Дополнительные сведения об интегрированном режиме IIS 7.0 см. в статье ASP.NET Integration with IIS7.

В этом разделе содержатся следующие подразделы:

Запрос в интегрированном режиме IIS 7.0 передается по этапам, подобным этапам запросов для ресурсов ASP.NET в службах IIS 6.0. Однако в IIS 7.0 эти этапы включают несколько дополнительных событий приложения, например MapRequestHandler, LogRequest и PostLogRequest.

Основное различие в этапах обработки в IIS 7.0 и службах IIS 6.0 заключается в способе интеграции ASP.NET с сервером IIS. В службах IIS 6.0 существуют два конвейера обработки запросов. Один конвейер предназначен для фильтров ISAPI и дополнительных компонентов машинного кода. Другой конвейер предназначен для компонентов приложения управляемого кода, например ASP.NET. В IIS 7.0 среда выполнения ASP.NET интегрирована с веб-сервером, что обеспечивает единый унифицированный конвейер для обработки всех запросов. Для разработчиков ASP.NET преимущества интегрированного конвейера заключаются в следующем:

  • Интегрированный конвейер может вызывать все события, объявленные в объекте HttpApplication, что позволяет существующим HTTP-модулям ASP.NET работать в интегрированном режиме IIS 7.0.

  • И модули машинного кода, и модули управляемого кода можно настраивать на уровне веб-сервера, веб-узла и веб-приложения. Это относится и к встроенным модулям управляемого кода ASP.NET для управления состоянием сеанса, проверкой подлинности форм, профилями и ролями. Более того, поддержку модулей управляемого кода можно включить или отключить для всех запросов, независимо от того, предназначен ли запрос для ресурса ASP.NET, например ASPX-файла.

  • Модули управляемого кода можно вызывать на любом этапе конвейера. Это можно сделать до обработки запроса на сервере, после обработки на сервере или в любой момент во время обработки.

  • Регистрация, включение и отключение модулей выполняется в файле Web.config приложения.

Ниже иллюстрируется настройка конвейера запросов приложения. Ниже перечислены входящие в пример компоненты.

  • Модуль машинного кода Anonymous и модуль управляемого кода Forms (соответствующий объекту FormsAuthenticationModule). Эти модули настраиваются и вызываются на этапе Authentication запроса.

  • Модуль машинного кода Basic и модуль управляемого кода Windows (соответствующий объекту WindowsAuthenticationModule). Эти модули показаны, но не настроены для приложения.

  • Этап Execute handler, на котором для формирования запроса вызывается обработчик (модуль, ограниченный URL-адресом). Для ASPX-файлов обработчик PageHandlerFactory используется для отклика на запрос. Для статических файлов на запрос отвечает модуль машинного кода StaticFileModule.

  • Модуль машинного кода Trace. Этот модуль показан, но не настроен для приложения.

  • Класс управляемого кода Custom module. Этот класс вызывается на этапе Log request.

Запрос конвейера в IIS 7.0

Сведения о проблемах с совместимостью приложений ASP.NET, перенесенных из предыдущих версий служб IIS в версию IIS 7.0, см. в разделе "Известные различия между интегрированным и классическим режимами" статьи Обновление приложений ASP.NET до служб IIS 7.0: различия между интегрированным режимом служб IIS 7.0 и классическим режимом.

В приведенной ниже таблице перечислены этапы жизненного цикла приложения ASP.NET, работающего в интегрированном режиме служб IIS 7.0.

Этап

Описание

Выполнение запроса для ресурса приложения.

Жизненный цикл приложения ASP.NET начинается с запроса, отправляемого обозревателем на веб-сервер.

В классическом режиме служб IIS 7.0 и IIS 6.0 конвейер запросов ASP.NET отделен от конвейера веб-сервера. Модули применяются только к запросам, переданным расширению ISAPI ASP.NET. Если расширение файла запрошенного типа ресурса не сопоставлено явным образом ASP.NET, функции ASP.NET для запроса не вызываются, поскольку запрос не обрабатывается средой выполнения ASP.NET.

В интегрированном режиме служб IIS 7.0 для обработки всех запросов используется унифицированный конвейер. Когда интегрированный конвейер получает запрос, этот запрос проходит по этапам, общим для всех запросов. Эти этапы представлены перечислением RequestNotification. Все запросы можно настроить таким образом, чтобы воспользоваться всеми преимуществами функций ASP.NET, поскольку эти функции инкапсулированы в модули управляемого кода, имеющие доступ к конвейеру запросов. Например, хотя расширение HTM-файла явным образом не сопоставлено ASP.NET, при запросе страницы HTML все равно вызываются модули ASP.NET. Это позволяет воспользоваться преимуществами проверки подлинности и авторизации ASP.NET для всех ресурсов.

Унифицированный конвейер получает первый запрос для приложения.

Когда унифицированный конвейер получает первый запрос для любого ресурса в приложении, создается экземпляр класса ApplicationManager, который представляет собой домен приложения, в котором обрабатывается запрос. Домены приложений обеспечивают изоляцию глобальных переменных между приложениями и позволяют выгружать каждое приложение по отдельности. В домене приложения создается экземпляр класса HostingEnvironment, который предоставляет доступ к сведениям о приложении, например об имени папки, в которой хранится приложение.

В процессе выполнения первого запроса элементы верхнего уровня приложения при необходимости компилируются, включая код приложения из папки App_Code. В папку App_Code можно включить собственные модули и обработчики, как показано ниже в подразделе Модули управляемого кода в IIS 7.0.

Для каждого запроса создаются объекты отклика.

После создания домена приложения и экземпляризации объекта HostingEnvironment создаются и инициализируются такие объекты приложения, как HttpContext, HttpRequest и HttpResponse. Класс HttpContext содержит отдельные объекты для каждого текущего запроса предложения, такие как HttpRequest и HttpResponse. Объект HttpRequest содержит сведения о текущем запросе, в том числе файлы cookie и сведения об обозревателе. Объект HttpResponse содержит отправляемый клиенту отклик, включающий все выходные данные и файлы cookie.

Ниже перечислены ключевые различия между службами IIS 6.0 и службами IIS 7.0, работающими в интегрированном режиме на платформе .NET Framework 3.0 и более поздних версий.

Объект HttpApplication, назначается запросу.

После инициализации всех запросов приложения оно запускается путем создания экземпляра класса HttpApplication. Если для приложения существует файл Global.asax, ASP.NET создает экземпляр класса Global.asax, производного от класса HttpApplication. Производный класс затем используется для представления приложения.

Bb470252.alert_note(ru-ru,VS.100).gifПримечание.
При первом запросе в приложении страницы или процесса ASP.NET создается новый экземпляр класса HttpApplication. Однако, в целях максимальной производительности, экземпляры класса HttpApplication могут повторно использоваться для нескольких запросов.

То, какие именно модули ASP.NET (например модуль SessionStateModule) будут загружаться, зависит от модулей управляемого кода, унаследованных приложением от родительского приложения. Это также зависит от того, какие модули настроены в разделе конфигурации файла Web.config приложения. Модули добавляются и удаляются в элементе modules файла Web.config приложения в разделе system.webServer. Дополнительные сведения см. в разделе Практическое руководство. Настройка раздела <system.webServer> для служб IIS 7.0.

Запрос обрабатывается конвейером HttpApplication.

При обработке запроса классом HttpApplication выполняются указанные ниже задачи. События полезны для тех разработчиков страниц, которым необходимо выполнять код при возникновении ключевых конвейера запросов. События также полезны также при разработке настраиваемого модуля, который необходимо вызывать для всех запросов к конвейеру. В настраиваемых модулях реализуется интерфейс IHttpModule. В интегрированном режиме IIS 7.0 необходимо зарегистрировать обработчики событий в методе Init модуля.

  1. Проверка запроса, при которой проверяются сведения, отправленные обозревателем, и определяется, содержит ли он потенциально вредоносную разметку. Дополнительные сведения см. в разделах ValidateRequest и Общие сведения об использовании сценариев.

  2. Сопоставление URL-адреса, если какие-либо URL-адреса были сконфигурированы в разделе UrlMappingsSection файла Web.config.

  3. Создание события BeginRequest.

  4. Создание события AuthenticateRequest.

  5. Создание события PostAuthenticateRequest.

  6. Создание события AuthorizeRequest.

  7. Создание события PostAuthorizeRequest.

  8. Создание события ResolveRequestCache.

  9. Создание события PostResolveRequestCache.

  10. Создание события MapRequestHandler. Необходимый обработчик выбирается на основе расширения файла запрошенного ресурса. Обработчик может быть модулем машинного кода, например StaticFileModuleIIS 7.0, или модулем управляемого кода, например классом PageHandlerFactory (для обработки ASPX-файлов). 

  11. Создание события PostMapRequestHandler.

  12. Создание события AcquireRequestState.

  13. Создание события PostAcquireRequestState.

  14. Создание события PreRequestHandlerExecute.

  15. Вызов метода ProcessRequest (или асинхронной версии IHttpAsyncHandler.BeginProcessRequest) соответствующего класса IHttpHandler для запроса. Например, если запрашивается страница, запрос обрабатывает текущий экземпляр страницы.

  16. Создание события PostRequestHandlerExecute.

  17. Создание события ReleaseRequestState.

  18. Создание события PostReleaseRequestState.

  19. Фильтрация ответов, если определено свойство Filter.

  20. Создание события UpdateRequestCache.

  21. Создание события PostUpdateRequestCache.

  22. Создание события LogRequest.

  23. Создание события PostLogRequest.

  24. Создание события EndRequest.

  25. Вызов события PreSendRequestHeaders.

  26. Вызов события PreSendRequestContent.

    Bb470252.alert_note(ru-ru,VS.100).gifПримечание.
    События MapRequestHandler, LogRequest и PostLogRequest поддерживаются только в том случае, если приложение работает в интегрированном режиме IIS 7.0 на платформе .NET Framework 3.0 или более поздней версии.

Файл Global.asax используется в интегрированном режиме IIS 7.0 во многом аналогично тому, как он использовался в ASP.NET для служб IIS 6.0. Дополнительные сведения см. в подразделе "События жизненного цикла и файл Global.asax" раздела Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0.

Одно различие заключается в возможности добавления обработчиков для событий MapRequestHandler, LogRequest и PostLogRequest. Эти события поддерживаются для приложений, работающих в интегрированном режиме IIS 7.0 на платформе .NET Framework 3.0 или более поздней версии.

Обработчики событий приложения можно задать в файле Global.asax, добавив код для выполнения всех запросов, обрабатываемых ASP.NET, например запросов страниц с расширением ASPX или AXD. Однако код обработчика в файле Global.asax не вызывается при запросе ресурсов, не являющихся ресурсами ASP.NET, например статических файлов. Чтобы создать код, выполняемый для всех ресурсов, создайте настраиваемый модуль и реализуйте в нем интерфейс IHttpModule. Настраиваемый модуль будет выполняться для всех запросов к ресурсам в приложении, даже если обработчик ресурса не является обработчиком ASP.NET.

Ниже перечислены модули управляемого кода ASP.NET, которые можно настраивать и загружать в IIS 7.0.

Для настройки модулей управляемого кода IIS 7.0 можно воспользоваться одним из двух указанных ниже методов.

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

Разработка настраиваемых модулей управляемого кода

Жизненный цикл приложения ASP.NET можно расширить с помощью модулей, в которых реализован интерфейс IHttpModule. Модули, в которых реализован интерфейс IHttpModule, являются модулями управляемого кода. Интегрированный конвейер ASP.NET и IIS 7.0 также можно расширить с помощью модулей машинного кода, которые в данном разделе не рассматриваются. Дополнительные сведения о модулях машинного кода и об общей настройке модулей см. в статье IIS 7.0 Modules Overview.

Модуль управляемого кода можно задать как файл класса в папке App_Code приложения. Также можно создать модуль как проект библиотеки классов, скомпилировать его и добавить в папку Bin приложения. После создания настраиваемого модуля его необходимо зарегистрировать с помощью IIS 7.0. Для управления модулями управляемого кода IIS 7.0 можно воспользоваться одним из описанных ниже методов. Например, чтобы зарегистрировать модуль управляемого кода только для одного приложения, можно изменить файл Web.config этого приложения. Пример регистрации модуля см. в разделе Пошаговое руководство. Создание и регистрация пользовательского HTTP-модуля.

Если модуль находится в папке App_Code или Bin и зарегистрирован в файле Web.config приложения, этот модуль вызывается только для этого приложения. Чтобы зарегистрировать модуль Web.config приложения, необходимо изменить элемент modules в разделе system.webServer. Дополнительные сведения см. в разделе Практическое руководство. Настройка раздела <system.webServer> для служб IIS 7.0. Изменения, внесенные с помощью IIS Manager или средства Appcmd.exe, вносятся в файл Web.config приложения. 

Модули управляемого кода также можно зарегистрировать в элементе modules хранилища конфигурации IIS 7.0 (файл ApplicationHost.config). Модули, зарегистрированные в файле ApplicationHost.config, обладают глобальной областью действия, поскольку они зарегистрированы для всех веб-приложений, размещенных с помощью служб IIS 7.0. Модули машинного кода, заданные в элементе globalModules файла ApplicationHost.config, также обладают глобальной областью действия. Если глобальный модуль в веб-приложении не используется, его можно отключить.

Пример

В приведенном ниже примере показан настраиваемый модуль, предназначенный для обработки событий LogRequest и PostLogRequest. Обработчики событий регистрируются в методе Init модуля.

using System;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;

// Module that demonstrates one event handler for several events.
namespace Samples
{
    public class ModuleExample : IHttpModule
    {
        public ModuleExample()
        {
            // Constructor
        }
        public void Init(HttpApplication app)
        {
            app.LogRequest += new EventHandler(App_Handler);
            app.PostLogRequest += new EventHandler(App_Handler);
        }
        public void Dispose()
        {
        }
        // One handler for both the LogRequest and the PostLogRequest events.
        public void App_Handler(object source, EventArgs e)
        {
            HttpApplication app = (HttpApplication)source;
            HttpContext context = app.Context;

            if (context.CurrentNotification == RequestNotification.LogRequest)
            {
                if (!context.IsPostNotification)
                {
                    // Put code here that is invoked when the LogRequest event is raised.
                }
                else
                {
                    // PostLogRequest
                    // Put code here that runs after the LogRequest event completes.
                }
            }

        }
    }
}


В приведенном ниже пример показано, как зарегистрировать модуль в файле Web.config приложения. Добавьте в раздел configuration подраздел system.webServer.

<system.webServer>
  <modules>
    <add name="ModuleExample" type="Samples.ModuleExample"/>
  </modules>
</system.webServer>

Дополнительный пример, в котором показано, как создать и зарегистрировать настраиваемый модуль, см. в разделе Пошаговое руководство. Создание и регистрация пользовательского HTTP-модуля.

Показ: