asp.net - route - Diferencia entre Application_Start y Application_OnStart
mvc routing examples (3)
Estoy en el proceso de agregar código ASP.NET MVC a un proyecto preexistente de Webforms de ASP.NET. Los diversos tutoriales sugieren agregar enrutamiento a un método llamado desde Application_Start () en Global.asax. Mi Global.asax ya tiene un método Application_OnStart (Object, EventArgs) con algún código de configuración.
Si intento tener Start y OnStart, el OnStart no se llama (y la configuración falla, causando errores). Parece que tengo que elegir uno u otro.
Mi pregunta es: ¿cuál debería estar usando? ¿Cuál es la diferencia entre ellos? ¿Los llaman en diferentes momentos?
(Nota: en el momento de escribir estas líneas, los three top hits de Google son inútiles y / o engañosos. Espero que Stack Overflow lo solucione).
De acuerdo con los documentos de Microsoft sobre el ciclo de vida de la aplicación ASP.Net , debe usar el método Application_start dentro del archivo global.asax:
Application_Start: se invoca cuando se solicita el primer recurso (como una página) en una aplicación ASP.NET. El método Application_Start se llama solo una vez durante el ciclo de vida de una aplicación. Puede utilizar este método para realizar tareas de inicio como cargar datos en la memoria caché e inicializar valores estáticos.
Application_OnStart: El evento Application_OnStart ocurre antes de que se cree la primera sesión nueva (cuando se hace referencia por primera vez al objeto Aplicación). Esto va en Global.asa , no en global.asax .
En ASP clásico (heredado), hay un puñado de nombres de funciones especiales que, si están definidos en su archivo global.asa, se ejecutarán en puntos específicos durante el ciclo de vida de la aplicación. Estos se definen como:
- Application_OnStart: se ejecuta una vez, cuando su aplicación recibe la primera solicitud HTTP e inmediatamente antes de que se procesen los archivos .ASP.
- Application_OnEnd: se ejecuta una vez, durante el cierre de la aplicación, después de que se hayan procesado todas las solicitudes.
- Session_OnStart: se ejecuta al inicio de cada sesión de usuario única. Si un usuario / cliente tiene las cookies deshabilitadas, esto se ejecuta para cada solicitud porque ASP nunca detecta la cookie de sesión que identifica una sesión existente.
- Session_OnEnd - (¡teóricamente!) Se ejecuta cada vez que caduca una sesión de usuario. Buena suerte con esto.
Estos están básicamente integrados en el clásico tiempo de ejecución de ASP: no puede cambiarlos, y no puede adjuntar ningún otro método a estos eventos.
En ASP.NET, hay una cosa llamada AutoEventWireup
que usa la reflexión para encontrar métodos que se ajusten a las convenciones de nomenclatura particulares, y ejecuta esos métodos en respuesta a eventos coincidentes generados por el tiempo de ejecución de ASP.NET. El ejemplo más común es el método Page_Load
, que se invoca automáticamente en respuesta a la clase de página que activa el evento Load durante el ciclo de vida de la página.
La misma técnica se usa para adjuntar controladores a eventos de ciclo de vida de nivel de aplicación. Buscará métodos denominados ModuleName_EventName o ModuleName_OnEventName, sin tomar ningún parámetro ()
ni (object sender, EventArgs e)
Aquí está la parte divertida: si defines más de un método de coincidencia, solo se ejecutará el que aparezca más reciente en el archivo . (El último método gana, básicamente)
Entonces, si global.asax.cs se ve así:
public class Global : System.Web.HttpApplication {
protected void Application_Start() {
Debug.WriteLine("A: Application_Start()");
}
protected void Application_Start(object sender, EventArgs e) {
Debug.WriteLine("B: Application_Start(object sender, EventArgs e)");
}
protected void Application_OnStart() {
Debug.WriteLine("C: Application_OnStart()");
}
protected void Application_OnStart(object sender, EventArgs e) {
Debug.WriteLine("D: Application_OnStart(object sender, EventArgs e)");
}
}
verá el mensaje D en su salida de depuración; si comenta el último método en ese bloque, verá el mensaje C en su lugar.
Por lo tanto, utilice cualquiera de las convenciones de nomenclatura que desee, pero si define más de una, solo se ejecutará la última que aparezca en su archivo fuente. Me quedaría personalmente con Application_Start(object sender, EventArgs e)
ya que esa es la firma generada por las plantillas de proyectos de Visual Studio y la mayoría de las herramientas de diseño / codificación de .NET.
La función Application_OnStart se invoca antes de procesar cualquier archivo .asp, antes de que cualquier texto o gráfico se represente y se envíe al navegador del usuario. Dentro de esta función, la siguiente llamada al método CreateObject en el objeto Servidor de Páginas de Servidor Activo crea el objeto CDO Rendering Library RenderingApplication. Si esta llamada tiene éxito, la variable objRenderApp contiene un puntero al nuevo objeto.
Todas las referencias que he podido encontrar se refieren a páginas .asp
Los métodos Application_Start y Application_End son métodos especiales que no representan eventos HttpApplication. ASP.NET los llama una vez durante la vigencia del dominio de la aplicación, no para cada instancia de HttpApplication.
Esta página se refiere a las páginas .aspx. Entonces, como está utilizando MVC y menciona global.asax, este es el que debería usar.