2012-06-19 10 views
8

Desidero annullare automaticamente l'iscrizione a un evento, che è stato cablato.Come posso annullare l'iscrizione a questo evento .NET?

Desidero sapere come annullare l'iscrizione all'evento EndRequest.

Non sono sicuro di come farlo, considerando che sto usando il codice inline. (è il termine tecnico corretto?)

So di poter utilizzare l'some.Event -= MethodName per annullare l'iscrizione .. ma non ho un nome di metodo, qui.

Il motivo per cui sto usando il codice inline è perché desidero fare riferimento a una variabile definita al di fuori dell'evento (che ho richiesto .. ma mi sembra maleodorante ... mi sento come se avessi bisogno di passarlo).

Qualche suggerimento?

tempo Codice ..

public void Init(HttpApplication httpApplication) 
{ 
    httpApplication.EndRequest += (sender, e) => 
    { 
     if (some logic) 
      HandleCustomErrors(httpApplication, sender, e, 
           (HttpStatusCode)httpApplication.Response.StatusCode); 
    }; 

    httpApplication.Error += (sender, e) => 
      HandleCustomErrors(httpApplication, sender, e); 
} 

private static void HandleCustomErrors(HttpApplication httpApplication, 
             object sender, EventArgs e, 
             HttpStatusCode httpStatusCode = 
              HttpStatusCode.InternalServerError) 
{ ... } 

Questo è solo un po 'di codice di esempio che ho, per me, per gestire gli errori in un'applicazione ASP.NET.

NOTA: non trasformarlo in una discussione sulla gestione degli errori di ASP.NET. Sto solo giocando con gli eventi e usando questi eventi per alcuni esempi R & D/learning.

risposta

11

Non è possibile annullare l'iscrizione a tale delegato anonimo. Si avrebbe bisogno di memorizzarlo in una variabile e cancellare l'iscrizione in un secondo momento:

EndRequestEventHandler handler = (sender, e) => 
{ 
    if (some logic) 
     HandleCustomErrors(httpApplication, sender, e, 
          (HttpStatusCode)httpApplication.Response.StatusCode); 
}; 

httpApplication.EndRequest += handler; 
// do stuff 
httpApplication.EndRequest -= handler; 
+0

Tecnicamente si potrebbe: 'httpApplication.EndRequest = null' ma che sarebbe annullare la sottoscrizione ** tutto **. – CodingGorilla

+0

+1 questo è il modo per farlo. – Joe

+0

Impressionante :) Funziona! Bene ... il codice è perfetto ma il mio utilizzo è sbagliato. Sto cercando di annullare l'iscrizione a un evento, dopo l'inizializzazione di LifeCycle. In quanto tale, il framework ASP.NET genera un brutto errore che dice "non puoi modificare questi eventi DOPO il passo init". Doh! –

Problemi correlati