Gestione di eventi pubblici
Gli eventi pubblici generati dalla classe HttpApplication sono supportati tramite la sintassi Applicazione_NomeEvento. È possibile dichiarare, ad esempio, un gestore per l'evento Error come protected void Application_Error(Object sender, EventArgs e)
. Viene inoltre fornito il supporto per gli eventi asincroni.
Sono disponibili tre categorie di eventi pubblici: gli eventi di applicazioni generati da HttpApplication, gli eventi di moduli generati dai moduli HTTP e gli eventi asincroni generati da HTTPApplication.
Eventi di applicazioni
Nelle tabelle riportate di seguito sono elencati gli eventi generati da HttpApplication per tutta la durata di un'applicazione. Nella prima tabella sono inclusi gli eventi generati prima dell'esecuzione dell'applicazione. Gli eventi sono elencati nell'ordine in cui si verificano.
Evento | Descrizione |
---|---|
BeginRequest | Segnala una nuova richiesta. Viene generato per ogni richiesta. |
AuthenticateRequest | Segnala che la richiesta è pronta per essere autenticata. Viene utilizzato dal modulo di protezione. |
AuthorizeRequest | Segnala che la richiesta è pronta per essere autorizzata. Viene utilizzato dal modulo di protezione. |
ResolveRequestCache | Viene utilizzato dal modulo della cache di output per impedire l'elaborazione di richieste memorizzate nella cache. |
AcquireRequestState | Segnala che occorre ottenere lo stato per ogni richiesta. |
PreRequestHandlerExecute | Segnala che il gestore delle richieste sta per essere eseguito. Costituisce l'ultimo evento che si verifica prima della chiamata del gestore HTTP per la richiesta. |
Nella tabella seguente vengono elencati gli eventi generati al termine dell'elaborazione. Gli eventi sono elencati nell'ordine in cui si verificano.
Evento | Descrizione |
---|---|
PostRequestHandlerExecute | Segnala che il gestore HTTP ha completato l'elaborazione della richiesta. |
ReleaseRequestState | Segnala che occorre memorizzare lo stato della richiesta, in quanto l'applicazione ha terminato l'esecuzione con la richiesta. |
UpdateRequestCache | Segnala che l'elaborazione del codice è completa e che il file è pronto per essere aggiunto alla cache di ASP.NET. |
EndRequest | Segnala che tutte le operazioni di elaborazione della richiesta sono terminate. Questo è l'ultimo evento chiamato al termine dell'applicazione. |
Sono inoltre presenti tre eventi per le singole richieste che possono essere generati in un ordine non deterministico. Si tratta degli eventi elencati nella tabella seguente.
Evento | Descrizione |
---|---|
PreSendRequestHeaders | Segnala che le intestazioni HTTP stanno per essere inviate al client. Questo evento consente di aggiungere, rimuovere o modificare le intestazioni prima dell'invio. |
PreSendRequestContent | Segnala che il contenuto sta per essere inviato al client. Questo evento consente di modificare il contenuto prima dell'invio. |
Error | Segnala un'eccezione non gestita. |
Eventi di moduli
È possibile connettersi tramite hook a eventi pubblicati dai moduli HTTP definiti in una configurazione. Machine.config
, ad esempio, dichiara i seguenti moduli predefiniti per tutte le applicazioni.
<httpModules>
<add name="OutputCache" type="System.Web.Caching.OutputCacheModule, .../>
<add name="Session" type="System.Web.SessionState.SessionStateModule, .../>
<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule, .../>
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule .../>
<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule .../>
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule, .../>
<add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule, .../>
</httpModules>
Cercare in ogni classe gli eventi pubblici che esse definiscono. È possibile eseguire l'hook in Global.asax tramite la sintassi NomeModulo**_On**NomeEvento. L'evento Start del modulo SessionStateModule, ad esempio, viene dichiarato protected void Session_Start(Object sender, EventArgs e)
in Global.asax. È possibile utilizzare la sintassi Session_OnStart in un blocco <script runat=server>
in un file di applicazione ASP.NET per definire un gestore eventi per l'evento Start di SessionStateModule, come indicato di seguito.
<script language="VB" runat="server">
Sub Session_OnStart()
' Session startup code goes here.
End Sub
</script>
Nota È possibile utilizzare con la stessa facilità la sintassi NomeModulo**_On**NomeEvento per eseguire l'hook di eventi in moduli personalizzati, a condizione che questi vengano dichiarati nel file di configurazione dell'applicazione.
Eventi asincroni
I gestori per eventi asincroni in HttpApplication devono essere connessi in modo esplicito chiamando il metodo AddNomeEventoAsincrono in Global.asax. Un gestore eventi asincrono per l'evento OnPostRequestHandlerExecuteAsync
, ad esempio, verrà registrato per l'evento chiamando il metodo AddOnPostRequestHandlerExecuteAsync(System.Web.BeginEventHandler
, System.Web.EndEventHandler)
. La sintassi abbreviata Applicazione**_On**NomeEvento è valida solo per gli eventi sincroni. Le dichiarazioni per gli eventi asincroni di HttpApplication sono le seguenti.
void OnAcquireRequestStateAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnAuthenticateRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnAuthorizeRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnBeginRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnEndRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnPostRequestHandlerExecuteAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnPreRequestHandlerExecuteAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnReleaseRequestStateAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnResolveRequestCacheAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnUpdateREquestCacheAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
Di seguito è riportato un esempio di blocco di codice che è possibile includere in Global.asax per creare un gestore asincrono per l'evento OnPostRequestHandlerExecuteAsync
.
<%@ language=c# %>
<%@ import namespace="System.Threading" %>
<script runat=server>
public override void Init() {
// Connect the asynchronous event PreRequestHandlerExecuteAsync.
AddOnPreRequestHandlerExecuteAsync(
new BeginEventHandler(this.BeginPreHandlerExecute),
new EndEventHandler(this.EndPreHandlerExecute));
}
IAsyncResult BeginPreHandlerExecute(Object source, EventArgs e, AsyncCallback cb, Object extraData) {
AsynchOperation asynch = new AsynchOperation(cb, Context, extraData);
asynch.StartAsyncWork();
return asynch;
}
void EndPreHandlerExecute(IAsyncResult ar) {
}
class AsynchOperation : IAsyncResult {
private bool _completed;
private Object _state;
private AsyncCallback _callback;
private HttpContext _context;
bool IAsyncResult.IsCompleted { get { return _completed; } }
WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
Object IAsyncResult.AsyncState { get { return _state; } }
bool IAsyncResult.CompletedSynchronously { get { return false; } }
public AsynchOperation(AsyncCallback callback, HttpContext context, Object state) {
_callback = callback;
_context = context;
_state = state;
_completed = false;
}
public void StartAsyncWork() {
ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), null /*workItemState*/);
}
private void DoSomething(Object workItemState) {
_context.Items["PreHandlerExecute"] = "Hello World from Async PreHandleExecute!";
_completed = true;
_callback(this);
}
}
</script>
Vedere anche
Supporto HTTP in fase di esecuzione | Moduli HTTP | Esempio di modulo HTTP personalizzato | Gestione e generazione di eventi