Application_Start no disparando?

143

Tengo una aplicación ASP.NET MVC (beta) en la que estoy trabajando y tengo problemas para determinar si estoy haciendo algo mal o si mi Application_Start método en Global.asax.cs no se dispara cuando intento para depurar la aplicación

Puse un punto de interrupción en una línea en mi Application_Startmétodo, y espero que cuando intente depurar la aplicación, el punto de interrupción se vea afectado ... pero nunca lo hace. No después de reiniciar IIS, no después de reiniciar, nunca. ¿Me estoy perdiendo de algo? ¿Por qué este método nunca se llama?

Bob Yexley
fuente
¿Su página global.asax hereda de la clase global en la que se encuentra su método?
Me metí en un caso en el global.asaxque simplemente faltaba el archivo. así que también vale la pena comprobarlo :-)
itsho

Respuestas:

85

Si esto está en IIS, la aplicación puede comenzar antes de que el depurador se haya conectado. Si es así, no estoy seguro de si puede enhebrar el sueño lo suficiente como para apegarse.

En Visual Studio, puede adjuntar el depurador a un proceso. Para ello, haga clic en Depurar >> Adjuntar para procesar. Adjunte al navegador y luego presione su aplicación. Para estar seguro, reinicie IIS y acceda al sitio. No estoy 100% convencido de que esto resolverá el problema, pero será mucho mejor que disparar un hilo de suspensión en App_Start.

Otra opción es alojar temporalmente en el servidor web incorporado hasta que finalice el inicio de la aplicación de depuración.

Gregory A Beamer
fuente
21
para expandir - (en VS2010, usando el tipo de proyecto MVC 3) haga clic con el botón derecho en proyecto web> propiedades> web (pestaña) y asegúrese de que el botón de opción "Usar Visual Studio Development Server" esté seleccionado. Entonces, los puntos de interrupción de Application_Start deberían alcanzarse perfectamente.
MemeDeveloper
Gracias @MemoDeveloper !! Es excelente !!
Praveen Prajapati
2
Ahhhhhh mannnnnnn, perdí un par de horas. ¡¡De nuevo!! Gracias por esta respuesta :)
Samuel
Si establece un punto de interrupción en Visual Studio en Global.asax.cs debajo de Application_Start () y no se activa, verifique su tipo de compilación. Si está ejecutando una versión, es posible que este punto de interrupción no se active. Cambie a Depurar y debería detenerse.
Paul
171

Nota: una buena alternativa fácil de usar el "Visual Studio Development Server" incorporado o IIS Express (por ejemplo, porque está desarrollando contra IIS y tiene configuraciones particulares que necesita para el correcto funcionamiento de su aplicación) es simplemente seguir ejecutándose en IIS (I use el servidor web personalizado + entrada de archivo de hosts + enlace IIS al mismo dominio)

  1. espere a que se inicie la sesión de depuración ok
  2. luego haga una edición de espacios en blanco en la raíz web.config y guarde el archivo
  3. actualiza tu página (Ctrl + F5)

Su punto de interrupción debe alcanzarse muy bien y puede continuar depurando en su hábitat natural de IIS . Excelente !

MemeDeveloper
fuente
Esta es una brillante conexión de reciclaje de AppDomain. Gracias !!
Sanjay10
No hay más Visual Studio Development Server. stackoverflow.com/questions/19676527/…
mac10688
1
@ mac10688 verdadero, pero todavía existe "IIS Express", que generalmente no es el entorno de producción. Actualizó la respuesta en consecuencia gracias.
MemeDeveloper
Respuesta aceptada definitiva. ¡Apunto dispositivos a mi IIS que no permitirán la comunicación cuando uso la edición IIS Express! Esto funcionó de maravilla.
Matt Skeldon el
54

La siguiente ayuda en cualquier caso (no importa si está usando IIS, Cassini o lo que sea):

  1. Establezca su punto de interrupción en Application_Start
  2. Inicie la depuración (el punto de interrupción probablemente no se alcanza) -> se muestra una página en el navegador
  3. Cambie web.config (por ejemplo, ingrese una línea en blanco) y guárdelo
  4. Vuelva a cargar la página en el navegador -> ¡se alcanza el punto de interrupción!

¿Por qué funciona esto? Cuando se cambia web.config, el servidor web (IIS, Cassini, etc.) realiza un reciclaje, pero en este caso (por cualquier motivo), el proceso sigue igual, por lo que debe seguir conectado con el depurador (Visual Studio )

Jochen Scharr
fuente
3
Clon, dos años después de stackoverflow.com/a/7655582/11635 - considere eliminar y poner cualquier información adicional en un comentario
Ruben Bartelink
en realidad @RubenBartelink, creo que esta respuesta es más clara que la otra, debido a la redacción y las explicaciones adicionales.
Heriberto Lugo
1
@HeribertoLugo Estoy de acuerdo con eso: 50 votos positivos es difícil de estar en desacuerdo por completo (sin embargo, estaría encantado de editar la otra respuesta para cerrar la brecha si alguien tiene el tiempo y el contexto; ha pasado algún tiempo desde que yo ' he usado un depurador en IIS!)
Ruben Bartelink
Estoy de acuerdo en editar el otro y eliminar este sería la mejor ruta ... Primero vi el otro y lo seguí ligeramente, así que no funcionó ... cuando vi este después de pasar media hora más en él, entonces hizo más sentido ... eso es media hora que no necesitaba perder ...
Heriberto Lugo
22

También estoy teniendo problemas con los puntos de interrupción en application_start con IIS, una aplicación alojada. Una buena solución es usar Debugger.Break (); en código en lugar del punto de interrupción VS

Flores
fuente
2
Creo que no alcanzar el punto de interrupción como algo relacionado con la ejecución de su grupo de aplicaciones en modo de canalización integrado. ¿Estás usando eso?
Flores
9

Tengo el mismo problema He cambiado mucho el nombre de mi solución. Después de eso obtuve dos aplicaciones web que no funcionaban y varias otras aplicaciones web estaban bien. Recibí un error de que tengo rutas incorrectas. Cuando intenté configurar el punto de interrupción en el Application_Startmétodo y luego reiniciar IIS, VS no interrumpió la ejecución. Con las aplicaciones web viables, el descanso funcionaba. Luego recordé que "solución limpia" y "reconstruir" no eliminan los ensamblados que quedan después de cambiar el nombre. ¡Y esa fue la solución! He limpiado manualmente los bindirectorios de mis aplicaciones web con errores y luego vi un nuevo error en el Global.asax Inherits=""atributo al que se hacía referencia dll antiguo. Lo he cambiado en nuevo y el descanso comenzó a funcionar. Supongamos que, durante el cambio de nombre Global.asax no se actualizó,

Dao
fuente
¡Guau, fue un dolor encontrarlo! Eso es para la propina!
Landon Poch
@Dao Realmente esto es increíble, gracias;) Perdí un par de horas en esto, debería haber encontrado tu respuesta antes :)
Pankaj Parkar
7

Tuve el mismo problema en un proyecto que asumimos después de que otro proveedor lo construyó. El problema era que, si bien había una serie de comandos escritos por el proveedor anterior en Global.asax.cs, que podrían llevarlo a creer que estaba en uso, en realidad se estaba ignorando por completo. Global.asax no estaba heredando de él, y es fácil nunca ver este archivo si el archivo .cs está presente; debe hacer clic con el botón derecho en Global.asax y hacer clic en Ver marcado para verlo realmente.

Global.asax:

<%@ Application Language="C#" %>

Necesitaba ser cambiado a:

<%@ Application Codebehind="Global.asax.cs" Inherits="ProjectNamespace.MvcApplication" Language="C#" %>

Donde ProjectNamespace es el espacio de nombres de su clase Global.asax.cs (generalmente el nombre de su Proyecto).

En nuestro caso, el archivo contenía un montón de código en línea, algunos de los cuales fueron copiados del archivo .cs, otros no. Acabamos de volcar el código en línea en el archivo .cs y gradualmente fusionamos nuestros cambios nuevamente.

Chris Moschini
fuente
Eso fue todo. Agregué una excepción al inicio de la aplicación (según la respuesta de Prisoner ZERO) y no se disparó en absoluto, por lo que no tiene nada que ver con el depurador. La actualización del marcado Global.asax lo arregló.
Patrick Borkowicz
5

Intente cambiar el modo de canalización administrado para el grupo de aplicaciones a "Clásico" en lugar de "Integrado". Eso resolvió el problema para mí. Buscando la razón ahora ...

(Los accesorios para esta respuesta pertenecen a Flores (vea su comentario sobre su propia respuesta), solo quería proporcionar esto como una respuesta separada para llamar más la atención)

acezanne
fuente
Si, funciona. Pero si supone que su aplicación debería funcionar en el grupo de aplicaciones integrado, entonces también debería depurarse en el grupo integrado.
Karel Kral
Mi aplicación tampoco alcanzaría puntos de interrupción después de "F5" cuando cambié de Clásico a Integrado. ¿Alguna vez descubriste por qué? No tengo ningún requisito para usar Integrated, pero es desalentador cuando estas cosas no funcionan sin una razón explicable.
CodexArcanum
5

Asegúrese de que su global.asax no esté en un subdirectorio. Tiene que colocarse a nivel raíz en su proyecto.

Cavernícola
fuente
¡¡¡Muchas gracias!!! ¡Me salvaste de volverme loco! Esto fue exactamente lo que estaba causando mi problema.
Yann Duran
1
Mi problema fue que acabo de crear una clase llamada Global.asax.csy esperaba que funcionara. Debe crearlo usando Add-> New Item-> Global Application Classpara que se cree con el Global.asaxarchivo de configuración de formularios web correspondiente .
Levi Fuller
4

Tuvimos un problema similar, donde se ignoraba global.asax.cs.

Resulta que el sitio se actualizó de un sitio web .NET 2 precompilado a un sitio .NET 4.0. En el servidor, el PrecompiledApp.configarchivo no se había eliminado de la carpeta raíz. Después de eliminarlo y reciclar el grupo de aplicaciones IIS y tocar web.config para reiniciar la aplicación, el código en Global.asax.cs comenzó a funcionar bien.

Glen Little
fuente
3

Una vez tuve un problema en el que los scripts de implementación no copiaban Global.asax y Global.asax.cs en realidad a la carpeta IIS ... Así que funcionó al depurar en el servidor de desarrollo, pero no bajo IIS.

Michael Angel
fuente
Yo tuve el mismo problema. después de que cargué Global.asax al servidor, se resolvió el problema.
Moslem Hady
3

Una entrada tardía ...

Para probar si la aplicación IIS se inicia o no antes de que el depurador haya tenido tiempo suficiente para adjuntarla, solo agréguela a la parte superior o inferior de su GLOBAL.ASAX Application_Start.

throw new ApplicationException("Yup, it fired");
Prisionero CERO
fuente
2

Cuando dice "depurar", ¿se refiere a iniciar realmente la aplicación desde el servidor web incorporado de Visual Studio para la depuración, o se refiere a adjuntar al proceso en IIS? Si es el primero, debe presionar Application_Start, pero si es el último, puede ser difícil estar en el proceso lo suficientemente temprano como para detectarlo.

Rex M
fuente
Correcto, me refiero a iniciar la aplicación desde VS. Lo tengo alojado en IIS, por lo que VS se está adjuntando a ese proceso. ¿Estás diciendo que el evento se dispara antes de que VS pueda unirse al proceso?
Bob Yexley
2

Cierre Visual Studio y elimine el binyobj carpetas en su proyecto web (o todos los proyectos en la solución).

Aquí hay comandos para eliminar estas carpetas de todos sus proyectos:

rm *\bin -r
rm *\obj -r
sobrantes
fuente
2

Hice algunos cambios basados ​​en "Análisis de código en compilación" de Visual Studio. Code Analysis sugirió "CA1822 Marcar miembros como estáticos" para Application_Start () en Global.asax. Lo hice y terminé con este problema.

Sugiero suprimir este mensaje de Análisis de Código y no alterar la firma de métodos / clases creados automáticamente por la plataforma utilizada para el arranque de la Aplicación. La firma del método Application_Start probablemente no era estática por alguna razón.

Volví a este método-firma y Application_Start () estaba disparando nuevamente:

    protected void Application_Start()
    { ... }
toralux
fuente
2

Enfrenté este problema al usar una página estática (por ejemplo, index.html) como página de inicio: no se llama a Application-Start. Descubrí que servir una página estática en realidad no inicia la aplicación. Solicitar una página .aspx sí.

Señor cocinero
fuente
Esto fue lo que hizo por mí. Gracias.
reekeecast
2

Asegúrese de que los espacios de nombres en Global.asax y Global.asax.cs sean iguales. Si son diferentes, no arrojará ningún error, pero tampoco alcanzará el punto de interrupción porque no está ejecutando application_start en absoluto.

Irfan
fuente
1

Creo que el evento de inicio de la aplicación solo se activa cuando se realiza la primera solicitud, ¿está accediendo a su sitio web (es decir, haciendo una solicitud)?

ninj
fuente
Sí, estoy haciendo una solicitud a la aplicación.
Bob Yexley
1

Tuve este problema en un proyecto .20 4 de formularios web vs2010 y probé todo lo mencionado en esta página. Terminé eliminando y agregando global.asax en realidad resolvió el problema por mí.

wonster
fuente
1

Tuve el mismo problema, no pude atrapar Application_Start. Y la razón fue que no se estaba disparando a una falta de coincidencia en el archivo de marcado. El archivo de marcado Global.asax estaba heredando otra clase ...

lobiZoli
fuente
1

¿Revisaste la configuración del proyecto? Tuve este problema y tenía la URL de inicio yendo a un puerto diferente al puerto específico de mi servidor. Me tomó demasiado tiempo darme cuenta ...

D. Kermott
fuente
1

Después de probar todas las otras respuestas que eran aplicables en mi situación y no tuve suerte con ninguna de ellas, entré en las propiedades del proyecto web (el proyecto del lado del servidor para una aplicación de Silverlight que usa los Servicios RIA), hice clic en "Web" y cambió el servidor seleccionado de "Local IIS" a "IIS Express". (Tenga en cuenta que estoy usando VS2013.) Esto resolvió el problema. Application_Start se ejecuta bajo "IIS Express" pero no bajo "Local IIS". Interesante...

MylesRip
fuente
Se esta ejecutando. Simplemente no puede depurarlo, ya que no se ha conectado al proceso de IIS o se ha adjuntado a él después de que se esté ejecutando.
uygar.raf
1

Estaba tratando de pasar por el código en RegisterRoutes () llamado desde el inicio de la aplicación y no alcanzar mi punto de interrupción. Determiné que Application_Start no estaba siendo llamado. Tuve que hacer un cambio para hacer un cambio superficial en App_start / RouteConfig.cs y guardarlo antes de que llamaran a Application_Start. Supongo que estos archivos se almacenan en caché en algún lugar y no se llaman a menos que se realice un cambio.

Don Dillard
fuente
1

Mi mismo problema se resolvió agregando referencia de System.Web.Routingensamblaje en el proyecto

ingrese la descripción de la imagen aquí

Prakash Mhasavekar
fuente
0

Si está utilizando System.Diagnostics.Debugger.Break (); solución alternativa (que creo que está bien para uso temporal) y "simplemente no funciona" en su máquina con Windows 8. La razón es un error en la depuración "Just in time" de Visual Studio.

La solución es la siguiente: arreglar la clave para el "Visual Studio Just-In-Time Debugger"

Abra regedit y vaya a HKEY_CLASSES_ROOT \ AppID {E62A7A31-6025-408E-87F6-81AEB0DC9347} para el valor de registro 'AppIDFlags', establezca el indicador en 0x8

Más información aquí: http://connect.microsoft.com/VisualStudio/feedback/details/770786/just-in-time-debugging-operation-attempted-is-not-supported

ProVega
fuente
0

En mi caso, eliminar la instancia del servidor de desarrollo ASP.NET incorporado a través de la bandeja del sistema resolvió el problema.

Maciej
fuente
0

Cosas extrañas y locas ... pero la depuración en una máquina servidor y otro usuario dejaron IIS Express ejecutándose en su sesión. Tuve que cerrar sesión en ese usuario para eliminar sus procesos IIS Express en ejecución. ¡Eso parece haber arreglado el problema!

Actualizar

Después de pasar más de 1 hora persiguiendo lo que estaba causando el problema ... aquí está el trato: logré escribir un poco sdentro de la <appSettings>sección Web.config. Visual Studio trató de advertirme en la Error Listventana con una advertencia . Confieso que rara vez reviso las advertencias ... debería comenzar a revisarlo a partir de ahora. : D Tan pronto como eliminé la infracción, sel punto de interrupción fue alcanzado Application_Start.

ingrese la descripción de la imagen aquí

Leniel Maccaferri
fuente
0

Tuve este problema al intentar inicializar log4net. Decidí hacer un constructor estático para Global.asax

static Global(){
//Do your initialization here statically
}
Mark Procopio
fuente
0

El problema se produce principalmente cuando intenta reubicar el archivo Global.asax a otro directorio de soluciones. Vuelva a ubicar el archivo Global.asax nuevamente en la ubicación predeterminada. Funcionará como se esperaba.

Arnab Chaudhuri
fuente
¿Qué pasa si todo en el sitio web está precompilado, incluido Global.asax.aspx? He precompilado archivos en el directorio bin. Application_Start no se activa.
Vin Shahrdar
0

Ninguna de las soluciones descritas anteriormente funcionó para mí. Sin embargo, reinstalar el paquete

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

usar nuget gui es un recorrido (no muy bueno)

Michele
fuente