ASP.NET MVC не вызывает global.asax 'EndRequest - PullRequest
14 голосов
/ 19 апреля 2009

Я пытаюсь выполнить некоторые действия в конце каждого запроса. Я изменил 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). Это также может быть причиной того, что мое событие (как описано в начале) не было вызвано.

Ответы [ 3 ]

17 голосов
/ 19 апреля 2009

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

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

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

16 голосов
/ 03 января 2010

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

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

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

    EndRequest += MyEventHandler;
}

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

5 голосов
/ 19 апреля 2009

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

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

...