2012-06-19 21 views
8

Ich möchte eine Veranstaltung programmatisch abmelden, die wie verdrahtet ist.Wie kann ich dieses .NET-Ereignis abbestellen?

Ich möchte wissen, wie ich das EndRequest Ereignis abmelden kann.

Ich bin nicht sicher, wie dies zu tun ist, da ich Inline-Code verwende. (Ist das der richtige Fachausdruck?)

Ich weiß, ich kann die some.Event -= MethodName verwenden, um sich abzumelden .. aber ich habe keinen Methodennamen, hier.

Der Grund, warum ich den Inline-Code verwende, ist, weil ich auf eine außerhalb des Ereignisses definierte Variable verweisen möchte (was ich brauchte .. aber ich fühle mich stinkend ... ich fühle, dass ich es weitergeben muss).

Irgendwelche Vorschläge?

-Code Zeit ..

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) 
{ ... } 

Dies ist nur ein Beispielcode ist, ich habe für mich Fehler in einer ASP.NET Anwendung zu behandeln.

HINWEIS: Bitte drehen Sie sich nicht in eine Diskussion über ASP.NET Fehlerbehandlung. Ich spiele nur mit Ereignissen herum und verwende diese Ereignisse für ein Beispiel R & D/lernen.

Antwort

11

Es ist nicht möglich, diesen anonymen Beauftragten abzumelden. Sie würden es in einer Variablen speichern müssen und es später abmelden:

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

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

Technisch konnte man: 'httpApplication.EndRequest = null' aber das würde abmelden ** alles **. – CodingGorilla

+0

+1 dies ist der weg es zu tun. – Joe

+0

Super :) Funktioniert! Nun, der Code ist perfekt, aber meine Verwendung ist falsch. Ich versuche, ein Ereignis nach der LifeCycle-Initialisierung abzubestellen. Daher gibt das ASP.NET-Framework einen unangenehmen Fehler aus, der besagt "Sie können diese Ereignisse NACH dem Init-Schritt nicht ändern". Do! –

Verwandte Themen