Взаимодействие между модулями. События модулей

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

При регистрации модулей все они попадают в коллекцию 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 объявляется вторым. И теперь можем запустить приложение:

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850