2012-07-02 11 views
7

Tengo una página web ASP.NET que se conecta a una serie de bases de datos y utiliza varios archivos. No estoy seguro de qué sucede si el usuario final cierra la página web antes de que se termine de cargar, es decir, ¿finaliza el ciclo de vida de ASP.NET o intentará el servidor generar la página y devolverla al cliente? Tengo un conocimiento razonable del ciclo de vida, pero no puedo encontrar ninguna documentación sobre esto.¿Continúa el ciclo de vida de asp.net si cierro el navegador en el medio del proceso?

Estoy tratando de localizar una posible pérdida de memoria. Estoy tratando de establecer si todo el código se ejecutará, es decir, si la conexión se eliminará, etc.

Respuesta

6

El código aún se ejecutará. Hay una propiedad IsClientConnected en el objeto HttpRequest que puede indicar si el cliente todavía está conectado si está realizando operaciones como la salida de transmisión en un bucle.

+1

Ese es un buen punto +1. Estoy usando response.flush varias veces en la página. ¿Qué sucede en el servidor descarga pero no hay un cliente? – w0051977

3

Una vez generada la solicitud a la página, pasará a la descarga en el ciclo de vida. No tiene idea de que el cliente no está allí hasta que envíe la información en la descarga.

Un aspecto único de esto es la parte de compilación dinámica. Usted puede leer sobre ello aquí: http://msdn.microsoft.com/en-us/library/ms366723

Para obtener más información del ciclo de vida del ASP.NET, mira aquí: http://msdn.microsoft.com/en-us/library/ms178472.aspx#general_page_lifecycle_stages

Así que, básicamente, se solicita una página, ASP.NET utiliza la compilación dinámica que básicamente crea la página, y luego intenta enviar la página al cliente. Se ejecutará todo el código que haya especificado en el código, sin importar si el cliente está allí o no para recibirlo.

Esta es una respuesta muy simplificada, pero eso es lo básico. Su código está compilado, la solicitud genera la respuesta y luego se envía la respuesta. No se envía en pedazos a menos que se lo indique explícitamente.

Editar: Gracias a Chris Lively por la recomendación de cambiar la redacción.

+1

Aunque generalmente es verdadero (+1), la última parte "No se envía por partes" debe cambiarse a "No se envía en pedazos * a menos que explícitamente le indique *". Ver http://stackoverflow.com/questions/2816194/use-of-response-flush-before-response-end – NotMe

+0

Buen punto. Cambió el original para reflejarlo. – JClaspill

+0

Gracias. ¿A qué te refieres con: "No se envía en pedazos a menos que explícitamente se lo digas"? Yo uso Response.Flush en la página. Estoy vagando si esto tiene algo que ver? – w0051977

2

Menciona el rastreo de una posible pérdida de memoria y la palabra "conexión". Voy a adivinar que te refieres a una conexión de base de datos.

SIEMPRE debe envolver todas sus conexiones y comandos en las cláusulas using. Esto garantizará la conexión/comando se eliminarse adecuadamente independientemente de si se produce un error, desconecta el cliente, etc.

Hay un montón de ejemplos aquí, pero que se reduce a algo como:

using (SqlConnection conn = new SqlConnection(connStr)) { 
    using (SqlCommand cmd = new SqlCommand(conn)) { 
    // do something here. 
    } 
} 

Si Por alguna razón, su código no le permite hacerlo de esta manera, entonces le sugiero que lo próximo que haga será reestructurarlo como lo hizo incorrectamente. Un problema común es que algunas personas crearán un objeto de conexión en la parte superior de la ejecución de la página y luego lo reutilizarán durante la vida de la página. Esto garantiza problemas, que incluyen pero no se limitan a: errores con el grupo de conexiones, pérdida de memoria, problemas de consultas aleatorias, limpieza completa de la aplicación ...

No se preocupe por el rendimiento con el establecimiento (y descartando) conexiones en el punto que las necesita en el código. Windows usa un grupo de conexiones que es rapidísimo y mantendrá las conexiones por el tiempo que sea necesario, incluso si su aplicación indica que ya está hecho.

También tenga en cuenta: debe usar este patrón CADA VEZ que está utilizando una clase no administrada.Aquellos siempre implementan IDisposable.

+1

+1 por mencionar declaraciones 'using'. No puedo estar más de acuerdo en usarlos casi todas las posibilidades que tengas. Lectura adicional para los interesados: http://msdn.microsoft.com/en-us/library/yh598w02.aspx y http://www.dotnetperls.com/using – JClaspill

+0

@JClaspill: excelentes enlaces. – NotMe

Cuestiones relacionadas