2011-04-29 10 views
6

Mi proyecto no tiene "global.asax" por varias razones y no puedo cambiar eso (es un componente). Además, no tengo acceso a web.config, por lo que un httpModule tampoco es una opción.Manejo de eventos en toda la aplicación sin Global.asax

¿Hay alguna manera de manejar los eventos de toda la aplicación, como "BeginRequest" en este caso?

Intenté esto y no funcionó, ¿alguien puede explicar por qué? Parece un error:

HttpContext.Current.ApplicationInstance.BeginRequest += MyStaticMethod; 

Respuesta

9

No, esto no es un error. Los controladores de eventos solo pueden vincularse a los eventos HttpApplication durante la inicialización de IHttpModule y está intentando agregarlos en algún lugar del Page_Init (mi suposición).

Por lo tanto, debe registrar dinámicamente un módulo http con los controladores de eventos deseados. Si es menor de .NET 4 hay una buena noticia para usted - no es PreApplicationStartMethodAttribute atributo (referencia: Three Hidden Extensibility Gems in ASP.NET 4):

Este nuevo atributo le permite tener ejecución de códigos de forma temprana en el ASP.NET canalización cuando se inicia una aplicación. Me refiero a manera temprana, incluso antes de Application_Start.

Así las cosas que quedan son bastante simple: usted necesita para crear su propio módulo HTTP con controladores de eventos que desea, y inicializador módulo de atributo a su archivo AssemblyInfo.cs. Aquí está un ejemplo de módulo:

public class MyModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += new EventHandler(context_BeginRequest); 
    } 

    public void Dispose() 
    { 

    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 

    } 
} 

Para registrar módulo de forma dinámica se puede utilizar DynamicModuleUtility.RegisterModule método del conjunto Microsoft.Web.Infrastructure.dll:

public class Initializer 
{ 
    public static void Initialize() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(MyModule)); 
    } 
} 

lo único que queda es añadir el atributo necesario para su AssemblyInfo.cs:

[assembly: PreApplicationStartMethod(typeof(Initializer), "Initialize")] 
Cuestiones relacionadas