Создание собственного модуля HTTP
Вы можете создать модуль для выполнения любых действий, начиная со сжатия ответа HTTP и заканчивая аутентификацией запроса HTTP. В этом примере вы создадите простой модуль, который добавляет в конец каждого запроса уведомление об авторских правах компании.
Сначала создается базовая структура класса. Давайте посмотрим на нее.
C#
using System; using System.Web; using System.Collections;
public class CopyrightModule : IHttpModule { public void Init(HttpApplication application) { }
public void Dispose() { } }
VB.NET
Imports System Imports System.Web Imports System.Collections
Public Class CopyrightModule Implements IHttpModule
Public Sub Init(ByVal application as HttpApplication) _ Implements IHttpModule.Init
End Sub
Public Sub Dispose() Implements IHttpModule.Dispose End Sub
End Class
Это основа класса. Сначала класс реализует интерфейс IHttpModule, требующий методы Init и Dispose. Метод Init позволяет передать события HTTP в собственные обработчики событий. Метод Dispose позволяет удалять все соединения и ресурсы перед закрытием модуля. Возможно передать в метод Init несколько событий, каждое из которых возникает на различных стадиях процесса обработки запроса HTTP. В таблице 4.12 приведен перечень всех событий, которые можно связать с вашим HTTP-модулем.
AсquireRequestState | Возникает, когда ASP.NET получает текущее состояние текущего запроса. Используйте событие при изменении состояния запроса. |
AuthenticateRequest | Возникает, когда ASP.NET устанавливает личность пользователя, сгенерировавшего запрос. |
AuthorizeRequest | Возникает, когда ASP.NET проводит авторизацию пользователя. |
BeginRequest | Возникает, когда ASP.NET запускает процесс обработки запроса. Это первое доступное вам событие данного процесса. |
Disposed | Возникает, когда приложение HTTP удаляется. |
EndRequest | Это последнее событие в процессе обработки запроса в ASP.NET. |
Error | Возникает, когда приложение выбрасывает необработанное исключение. |
PostRequestHandlerExecute | Возникает, когда завершается выполнение обработчика HTTP ASP.NET. |
PreRequestHandlerExecute | Возникает непосредственно перед тем, как ASP.NET передаст запрос в обработчик HTTP. |
PreSendRequestContent | Возникает непосредственно перед тем, как ASP.NET отправит содержимое ответа пользователю. |
PreSendRequestHeaders | Возникает непосредственно перед тем, как ASP.NET отправит пользователю заголовки HTTP. |
ReleaseRequestState | Возникает после того, как ASP.NET закончит выполнение всех обработчиков запросов. Оно запускает модули состояния, записывающие текущее состояние данных. |
ResolveRequestCache | Возникает, когда ASP.NET завершает процесс авторизации. Затем оно запускает все имеющиеся модули кэширования для передачи кэшированных страниц вместо передачи запроса в обработчик. |
UpdateRequestCache | Возникает, когда ASP.NET завершает выполнение обработчика HTTP. Затем оно запускает все имеющиеся модули кэширования для кэширования ответа для будущих запросов. |
Все эти события доступны для собственных модулей HTTP. Давайте посмотрим, как добавлять события в собственный модуль HTTP. Первым шагом является передача события в метод Init.
C#
public void Init(HttpApplication application) { application.EndRequest += (new EventHandler(this.Application_EndRequest)); }
VB.NET
Public Sub Init(ByVal application as HttpApplication) Implements _ IHttpModule.Init AddHandler application.EndRequest, _ AddressOf Me.Application_EndRequest End Sub
Когда модуль инициализирован, событие EndRequest объекта Application передается в метод Application_EndRequest. Когда готов к отправке ответ, вызывается метод Application_EndRequest, модифицирующий ответ. Ниже приведен код, в котором данный метод модифицирует запрос.
C#
private void Application_EndRequest(Object source, EventArgs e) { HttpApplication application = (HttpApplication) source; HttpContext context = application.context; context.Response.Write("Copyright James Avery 2003"); }
VB.NET
Private Sub Application_EndRequest(ByVal [source] As [Object], _ ByVal e As EventArgs) Dim application as HttpApplication = CType([source], _ HttpApplication) Dim context As HttpContext = application.Context context.Response.Write _ ("Copyright James Avery 2003</body></html>") End Sub