2010-06-15 15 views
14

Nuestra aplicación web ASP.NET 2 maneja excepciones muy elegantemente. Detectamos excepciones en Global ASAX en Application_Error. Desde allí registramos la excepción y mostramos un mensaje amigable al usuario.¿Cómo bloqueo el Pool de aplicaciones?

Sin embargo, esta mañana implementamos la última versión de nuestro sitio. Se ejecutó bien durante media hora, pero luego el Pool de aplicaciones se colgó. El sitio no volvió a aparecer hasta que restablecimos la versión anterior.

¿Cómo puedo hacer que el grupo de aplicaciones se bloquee y omita el controlador de excepción normal? Estoy tratando de replicar este problema, pero sin suerte hasta el momento.


actualización: encontramos la solución. Una de nuestras páginas fue screencraping en otra página. Pero la URL se configuró incorrectamente y la página terminó screencraping sí mismo infinitamente, lo que causa una excepción de desbordamiento de la pila.

+0

El registro de eventos en el servidor debe decirle qué sucedió y le dará una mejor idea de cómo replicarlo. –

+0

StackOverflow debería hacerlo, creo. (pruebe alguna recursión sin una condición de terminación) –

+0

Esto me ayudó a depurar el mismo problema en nuestro sistema: http://stackoverflow.com/questions/5053708/how-to-debug-w3wp-exe-process-was-terminated- due-to-a-stack-overflow-works-on –

Respuesta

12

El error más común que tengo de ver y "accidente de la piscina" es el bucle llamada.

public string sMyText 
{ 
    get {return sMyText;} 
    set {sMyText = value;} 
} 

Sólo tiene que llamar la sMyText ...

2

Puede intentar arrojando un ThreadAbortException.

11

Para hacer esto, todo lo que necesita hacer es lanzar cualquier excepción (sin manejarlo por supuesto) desde fuera del contexto de una solicitud.

Por ejemplo, alguna excepción planteada en otro hilo debe hacerlo:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Create a thread to throw an exception 
    var thread = new Thread(() => { throw new ArgumentException(); }); 

    // Start the thread to throw the exception 
    thread.Start(); 

    // Wait a short while to give the thread time to start and throw 
    Thread.Sleep(50); 
} 

Más información se puede encontrar here in the MS Knowledge Base

5

respuesta Aristos es buena. También he visto hacer con una estúpida anulación en el ciclo de vida Página demasiado cuando alguien cambie el método de overriden OnInit a OnLoad sin cambiar la llamada base para que recursed redonda en cirlces a través del ciclo de vida: es decir

protected override void OnLoad(EventArgs e) 
{ 
    //some other most likely rubbish code 
    base.OnInit(e); 
} 
+1

ah, sí, esto también es algo que tengo que ver ... +1 – Aristos