Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Интерфейс IHttpModule определяет ряд методов, которые классы модулей должны реализовать:
Init(app): вызывается при создании модуля и его передаче объекту HttpApplication, в котором этот модуль регистрируется
Dispose(): вызывается, когда обработка запроса завершена. В этом методе происходит освобождение связанных ресурсов
Создадим простейший модуль, который будет измерять время обработки запроса. Для этого добавим в проект новый каталог Modules, в котором будут
находиться наши модули. Затем добавим в этот каталог новый класс. Назовем его TimerModule
:
using System.Diagnostics; //......................... public class TimerModule : IHttpModule { private Stopwatch timer; public void Init(HttpApplication app) { app.BeginRequest += HandleBeginRequest; app.EndRequest += HandleEndRequest; } private void HandleBeginRequest(object src, EventArgs args) { timer = Stopwatch.StartNew(); } private void HandleEndRequest(object src, EventArgs args) { HttpContext context = HttpContext.Current; context.Response.Write(string.Format( "<div style='color:red;'>Время обработки запроса: {0:F5} секунд</div>", ((float)timer.ElapsedTicks) / Stopwatch.Frequency)); } public void Dispose() {} }
Для замеров времени используется класс Stopwatch
из пространства имен System.Diagnostics
.
В методе Init()
устанавливаются обработчики для событий начала и завершения обработки запроса. Оба обработчика принимают два параметра:
src
- объект приложения HttpApplication и args
- аргументы события EventArgs.
Обработчик начала обработки запроса просто запускает таймер. А обработчик завершения обработки запроса получает прошедшее время и добавляет информацию о нем
в ответ клиенту через метод Response.Write()
.
Метод Dispose()
оставлен пустым, так как нам не надо освобождать никаких ресурсов, связанных с модулем.
После определения модуля его надо зарегистрировать в файле web.config. Для этого добавим в файл в пределах узла
configuration
следующую секцию:
<system.webServer> <modules> <add name="Timer" type="LifeCycleApp.Modules.TimerModule"/> </modules> </system.webServer>
В данном случае у меня приложение называется LifeCycleApp, а модуль TimerModule находится в папке Modules, поэтому полное название типа будет LifeCycleApp.Modules.TimerModule.
И в конце мы можем протестировать модуль:
И внизу страницы мы увидим, что к общему содержимому страницы добавлено время выполнения запроса.