2012-06-19 18 views
8

Deseo anular la suscripción programaticamente a un evento, que se ha cableado.¿Cómo puedo cancelar la suscripción a este evento .NET?

Deseo saber cómo puedo anular la suscripción al evento EndRequest.

No estoy seguro de cómo hacerlo, teniendo en cuenta que estoy usando el código en línea. (¿Es ese el término técnico correcto?)

Sé que puedo usar el some.Event -= MethodName para anular la suscripción ... pero no tengo el nombre de un método, aquí.

La razón por la que estoy usando el código en línea es porque deseo hacer referencia a una variable definida fuera del evento (que requería ... pero se siente mal ... siento que necesito pasarlo).

¿Alguna sugerencia?

tiempo .. Código

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

Esto es sólo un ejemplo de código que tengo, para mí de manejar los errores en una aplicación ASP.NET.

NOTA: No convierta esto en una discusión sobre el manejo de errores de ASP.NET. Solo estoy jugando con eventos y usando estos eventos para obtener una muestra R & D/learning.

Respuesta

11

No es posible anular la suscripción de ese delegado anónimo. Lo que se necesita para almacenar en una variable y darse de baja más tarde:

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

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

Técnicamente se podría: 'httpApplication.EndRequest = null' pero eso sería darse de baja ** todo **. – CodingGorilla

+0

+1 esta es la manera de hacerlo. – Joe

+0

Impresionante :) ¡Funciona! Bueno ... el código es perfecto pero mi uso es incorrecto. Estoy intentando anular la suscripción a un evento después de la inicialización de LifeCycle. Como tal, el marco ASP.NET arroja un desagradable error que dice "no puede modificar estos eventos DESPUÉS del paso de inicio". Doh! –

Cuestiones relacionadas