2008-11-14 5 views
3

В принципе, я пытаюсь написать следующее (псевдокод) в качестве HttpModule ASP.NET:ASP.NET HttpModule - гарантированное исполнение кода pre-and post-handler?

*pre-code* 
try { handler.ProcessRequest(...) } 
catch (Exception) { *error-code* } 
finally { *post-code* } 

Я обнаружил, что я могу подключить в HttpModule.PreExecuteHandler для «пре-код» и .error для «кода ошибки». Но PostExecuteHandler, похоже, не работает надежно.

BeginRequest и EndRequest работают надежно, но слишком рано для кода, который мне нужно написать, что требует проверки обработчика, который был выбран для выполнения. Обработчик не выбирается до BeginRequest.

Есть ли наилучшая практика для написания такого рода обертки?

Спасибо!

ответ

2

Невозможно выполнить то, что вы хотите (по крайней мере, в HttpModule), кроме как не вызвать Response.End. This article объясняет это довольно хорошо и предлагает альтернативу Response.End в случае, если это побочный эффект вашего вызова Server.Transfer.

+0

Спасибо - это именно то, что я искал, а не для Server.Transfer, но для Request.End(). PostRequestHandlerExecute определенно не выполняется, но я думаю, что EndRequest вызывает вызов даже в этом случае? Ну, я пойду тест ... – 2008-11-18 21:06:32

-2

Добавьте это в файл Global.asax:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
{ 
    // 
} 

protected void Application_PostRequestHandlerExecute(object sender, EventArgs e) 
{ 
    // 
} 

Это должно работать на 100%.

+0

Спасибо, я ценю ответ - но я ищу сделать это без файла Global.ASAX в HttpModule. Кроме того, я считаю (но еще не проверял в ASAX), что если кто-то выполняет Response.End внутри обработчика, PostRequestHandlerExecute никогда не будет работать. Только событие End будет ... (?) – 2008-11-17 15:38:06