2008-12-01 25 views
18

Durante la práctica de personalizar VirtualPathProvider, me encontré con que el VirtualPathProvider personalizado puede estar registrada en Global.asax o en el método de acuerdo con MSDN AppInitialize http://msdn.microsoft.com/en-us/library/system.web.hosting.virtualpathprovider.aspx. Sin embargo, MSDN no describe claramente el método AppInitialize.¿Cuándo se invoca el método AppInitialize en ASP.NET?

¿Alguna método AppInitialize estática en la carpeta App_Code se invocará automáticamente por ASP.NET tiempo de ejecución en el arranque?

Respuesta

31

Si bien hay muy poca documentación sobre el método AppInitialize(), estás en lo correcto en su suposición de que cualquier clase en la carpeta App_Code que contiene una firma método como este:

public static void AppInitialize() 

será invocado cuando el La aplicación Asp.Net se inicia. Recuerde que App_Code es una carpeta especial para Asp.Net y todo lo que hay adentro se trata de manera un poco diferente. Buena suerte para encontrar documentación sobre todas las pequeñas peculiaridades (como la mencionada anteriormente) de la carpeta App_Code.

Otra cosa a recordar, sin embargo, es que una sola clase puede contener una firma para el método AppInitialize() o de lo contrario obtendrá un error de compilación en tiempo de ejecución similar a esto:

El método AppInitialize se define ambos en 'App_Code.SomeClassOne' y en 'App_Code.SomeClassTwo'.

Así, mientras que esto es perfectamente válido:

public class SomeClassOne 
{ 
    public static void AppInitialize() 
    { 
     HostingEnvironment.Cache["InitializationTimeOne"] = DateTime.Now; 
    } 
} 

Esto generará el error del compilador que he mencionado anteriormente:

public class SomeClassOne 
{ 
    public static void AppInitialize() 
    { 
     HostingEnvironment.Cache["InitializationTimeOne"] = DateTime.Now; 
    } 
} 

public class SomeClassTwo 
{ 
    public static void AppInitialize() 
    { 
     HostingEnvironment.Cache["InitializationTimeTwo"] = DateTime.Now; 
    } 
} 

Espero que esto aclare un poco las cosas para ti :)

+0

Esto es muy útil. ¿Alguna idea de dónde encontrar otros ejemplos de comportamientos especiales de App_Code? –

+2

Tuve esto trabajando en un servicio web WCF durante algún tiempo, y de repente misteriosamente dejó de funcionar. Si ejecuto el servicio web en Visual Studio, la inicialización tiene lugar, pero si lo despliego a IIS no parece haber ninguna inicialización. Podría jurar que esto estaba funcionando, y ahora de repente no lo es. ¿Algunas ideas? – Farinha

+0

Encontrado el problema. Cambié la "Acción de compilación" en el archivo .cs que contenía la inicialización de "Contenido" a "Compilar" en un intento de no copiar la carpeta "Código_aplicación" en la carpeta de publicación del servicio web. Bueno, eso no se puede hacer ... – Farinha

Cuestiones relacionadas