Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
При регистрации модулей все они попадают в коллекцию Modules, которая имеется у класса приложения HttpApplication. Получив один модуль из этой коллекции, мы можем с ним взаимодействовать - получать его поля и свойства и подписываться на события. Например, изменим модуль из предыдущей темы следующим образом:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Web; namespace LifeCycleApp.Modules { public class RequestTimerEventArgs : EventArgs { public float Duration { get; set; } } public class TimerModule : IHttpModule { private Stopwatch timer; public event EventHandler<RequestTimerEventArgs> RequestTimed; 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; float duration = ((float)timer.ElapsedTicks) / Stopwatch.Frequency; context.Response.Write(string.Format( "<div style='color:red;'>Время обработки запроса: {0:F5} секунд</div>",duration)); if (RequestTimed != null) { RequestTimed(this, new RequestTimerEventArgs { Duration = duration }); } } public void Dispose() {} } }
В отличие от старой версии модуля из прошлой темы здесь добавляется событие и осуществляется его вызов в обработчике события EndRequest
.
Теперь добавим еще один модуль. Назовем его TotalTimeModule. Он будет рассчитывать количество запросов и общее время обработки запросов на основе данных из предыдущего модуля:
public class TotalTimeModule : IHttpModule { private static float totalTime = 0; private static int requestCount = 0; public void Init(HttpApplication app) { IHttpModule module = app.Modules["Timer"]; if (module != null && module is TimerModule) { TimerModule timerModule = (TimerModule)module; timerModule.RequestTimed += HandleRequestTimed; } app.EndRequest += HandleEndRequest; } private void HandleRequestTimed(object src, RequestTimerEventArgs e) { totalTime += e.Duration; requestCount++; } private void HandleEndRequest(object src, EventArgs e) { HttpContext context = HttpContext.Current; string result=string.Format("<div style='color:red;'>Количество обращений: {0} </div>" + "<div style='color:red;'>Общее время обработки запросов: {1:F5} секунд </div>", requestCount, totalTime); context.Response.Write(result); } public void Dispose() {} }
Так как предыдущий модуль называется у нас Timer (как определено в web.config), то по этому имени мы можем получить данный модуль: app.Modules["Timer"]
.
И затем подписаться на его событие. Обработка события проста: изменяем значение переменных totalTime и requestCount.
Также добавим новый модуль в файл web.config:
<system.webServer> <modules> <add name="Timer" type="LifeCycleApp.Modules.TimerModule"/> <add name="Total" type="LifeCycleApp.Modules.TotalTimeModule"/> </modules> </system.webServer>
И поскольку второй модуль зависит от первого - берет его данные для подсчета своих полей, то модуль Total объявляется вторым. И теперь можем запустить приложение: