ASP.NET MVC не вызывает global.asax 'EndRequest

Я пытаюсь выполнить некоторые действия в конце каждого запроса. Я изменил Application_Start(), который генерируется при создании нового проекта, чтобы выполнить тест:

protected void Application_Start()
{
    EndRequest += (s, e) =>
    {
        Console.Write("fghfgh");
    };
    RegisterRoutes(RouteTable.Routes);
}

Лямбда не будет вызвана. Любые идеи, почему?

изменить: Я вижу, что они делают аналогичную вещь в SharpArch [http://code.google.com/p/sharp-architecture/], и она там работает... И нет, я не хочу использовать HttpModule.

edit2: Единственным обходным решением, которое я нашел, является использование Application_EndRequest в сочетании с частным статическим членом global.asax:

private static WebSessionStorage wss;
protected void Application_Start()
{
    //...
    wss = new WebSessionStorage(this);
    //...
}

protected void Application_EndRequest(object sender, EventArgs e)
{
    wss.EndRequest(sender, e);
}

wss должен быть закрытым, потому что кажется, что Application_EndRequest вызывается с использованием другого экземпляра объекта (this). Это также может быть причиной моего события (как описано в начале), которое не вызывается.

Ответы

Ответ 1

Я обычно делаю:

protected void Application_EndRequest(object sender, EventArgs e)
{
}

Это работает так, как ожидалось. Однако не знаю о событии.

Ответ 2

Экземпляр HttpApplication, представленный вашим файлом global.asax, представляет собой единственный экземпляр, который представляет только первый объект HttpApplication. Не гарантируется, что этот экземпляр HttpApplication будет использоваться для любого другого запроса.

Вам необходимо переопределить метод Init() в global.asax и в этом методе подключить любые события, которые вы хотите:

public override void Init() {
    base.Init();

    EndRequest += MyEventHandler;
}

Для получения дополнительной информации о объекте HttpApplication обратитесь к этой статье MSDN.

Ответ 3

Лучше всего сделать это в HttpModule. Я использую HttpModule для управления сеансом NHibernate в приложении MVC, и он отлично работает. В запросе begin я связываю sessionFactory с ManagedWebSessionContext (в NHibernate, но довольно недокументированным), а затем в конечном запросе я совершаю транзакции и отвязываю sessionFactory.

Я думаю, что более чистое разделить это на HttpModule.