2010-07-10 13 views
5

Estoy usando ASP.Net + .Net 3.5 + VSTS 2008 + IIS 7.0 + C# para desarrollar una aplicación web. Creo que al depurar en VSTS 2008, si llamo al método Response.Close() en page_load (consulte el código a continuación), habrá un error (de IE al acceder a la página) como que no se puede conectar al servidor.ASP.Net Response.Close issue

Mi pregunta es,

  1. Normalmente, cuando hay que llamar Response.Close()? ¿O no necesita llamar (confíe en el marco de ASP.Net para cerrar automáticamente)?

BTW: mi comprensión anterior es que el desarrollador siempre debe llamar a Response.Close cuando el procesamiento se completa en el lado del servidor y todos los datos se han escrito al cliente mediante Response.Write. ¿Estoy en lo correcto?

2 ¿Por qué me encontré con ese error en mi código? ¿Cuál es la raíz de la causa?

 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Response.Write("Hello World! "); 
     Response.Close(); 
    } 

Respuesta

9

lo siguiente de la MSDN website podría ser útil aquí:

Este método finaliza la conexión con el cliente de una manera abrupta y no está diseñado para el procesamiento de solicitudes HTTP normal. El método envía un paquete de reinicio al cliente, que puede hacer que se descarten los datos de respuesta almacenados en el servidor, el cliente o en algún punto intermedio.

Puede utilizar este método en respuesta a un ataque de un cliente HTTP malintencionado.Sin embargo, normalmente debe llamar a CompleteRequest en su lugar si desea pasar al evento EndRequest y enviar una respuesta al cliente.

+0

¿Quiere decir que, en cualquier situación, no necesitamos llamar a Response.Close? Si es así, ¿por qué ASP.Net expone tal método? – George2

+2

"Puede usar este método en respuesta a un ataque de un cliente HTTP malicioso". –

+1

Ciertamente no en uso normal. Vea el segundo párrafo de MSDN para un posible uso. – Andy

1

En mi experiencia, no hay razón para llamar Response.Close(); en el ejemplo de código que nos ha facilitado, simplemente eliminarlo.

En las páginas del ciclo de vida después de que se descargue Page_Load, hay una serie de otros métodos que serán llamados que cerrarán sus respuestas por usted.

Read here for the Page Lifecycle

+0

¿Quiere decir en todas las situaciones que no necesita llamar a Response.Close? Si es así, ¿por qué ASP.Net expone tal método? – George2

+0

Si no llama a Response.Close(), ¿cómo se ha completado la solicitud del cliente y se ha generado toda la respuesta? IE no necesita esa información? – George2

+1

Estoy haciendo esta afirmación con las confunciones de su código ejemplo –

1

Para responder a la pregunta 1:

Debe llamar Response.Close() cuando su necesidad de terminar la conexión - es decir, nada más necesita ser enviada al cliente en absoluto. Esto no incluye lo que ha publicado, ya que el resto de la página debe procesarse y enviarse al cliente. Normalmente lo llamarías al devolver datos que no son una página de una página aspx (por ejemplo, un archivo pdf, una imagen, etc.).

Para contestar la pregunta 2:

No debe llamar Response.Close() en el controlador de eventos Page_Load - significará que el resto de la page lifecycle no funcionará correctamente.

De MSDN (HttpResponse.Close method):

Este método finaliza la conexión con el cliente de una manera abrupta y no está diseñado para el procesamiento de solicitudes HTTP normal. El método envía un paquete de reinicio al cliente, que puede hacer que se descarten los datos de respuesta almacenados en el servidor, el cliente o en algún punto intermedio.

+0

¿Quiere decir en cualquier caso que no necesitamos llamar a Response.Close? Si es así, ¿por qué ASP.Net expone tal método? – George2

+1

@ George2: en la mayoría de las situaciones, no es necesario que lo use. Está ahí para las situaciones raras que necesitas. – Oded

+0

Gracias Oded! Creo que solo necesitamos implementar todos los manejadores de fase/evento documentados en el enlace sobre el documento del ciclo de vida que usted mencionó, y el marco subyacente ASP.Net cerrará la conexión automáticamente para nosotros, ¿correcto? Mi confusión anterior es si no cerramos Response, ¿hay alguna filtración? – George2

1

.NET es una red muy flexible que le permitirá hacer todo lo que pueda antes de .NET. (y más obviamente). Pero lo más maravilloso es que .NET se encargará de todo lo que pueda ocuparse de usted.

Eso significa que si crea y vacía una página web y la ejecuta en su navegador, no tiene que hacer nada más para que funcione.

veces, sin embargo es posible que se encuentra en una situación en la que hay que hacer algo extraordinario y que será thankfull para la existencia de funciones como Reponse.Close()

En el caso de que no está haciendo tal cosa lo que no hay necesidad de cualquier llamada de función especial.

Además de eso Response.Write() es lo que solíamos utilizar en los días ... ¿Todavía estás pensando en el clásico modo ASP tal vez?

Sugerencia: No utilice Response.Write()

Pero poner una etiqueta en su página web y su uso:

this.Label1.Text = "Hello world"; 

comentario Complementarias:

El propósito de ASP.Net en particular, es enviar páginas web a un navegador, recopilar cualquier información publicada, procesarla, interactuar con el sistema operativo del servidor, etc.

Por lo tanto, en mi opinión puede suponerse que se ha tenido cuidado en 1) publicar páginas rápidamente y 2) asegurarse de que nada vaya mal cuando el usuario sigue las pautas sobre cómo programar páginas web .Net.

No es necesario implementar TODOS los controladores de eventos de página. Comprenda el marco, comprenda lo que hace cada evento de página y aprenda cuándo implementar qué evento.

Si solo va a mostrar datos de una base de datos, ni siquiera necesita manejadores de eventos. Lea acerca de los controles de datos (fuentes de datos, GridView, ListView, Repeater, etc.).

Supongamos que si no hace nada, el marco lo hará por usted. (SI no hace nada en absoluto, no pasa nada, eso es por diseño)

Saludos.

+0

Gracias Jeroen! Creo que solo necesitamos implementar todos los manejadores de fase/evento documentados en el enlace sobre el documento del ciclo de vida (http://msdn.microsoft.com/en-us/library/ms178472.aspx), y el marco subyacente ASP.Net cerrar la conexión automáticamente para nosotros, ¿correcto? Mi confusión anterior es (1) si no cerramos la respuesta, ¿hay alguna fuga? (2) si no cerramos, los datos de respuesta pueden almacenarse en el servidor y no enviarse al navegador del cliente de manera oportuna. ¿Algún comentario? – George2

+1

Leer mi edición ... – Jeroen

+0

Gracias Jeroen! Entonces, para nuestros desarrolladores, solo necesitamos implementar todos los manejadores de fase/evento necesarios que importen para nuestra aplicación específica, como se documenta en el enlace sobre el documento de ciclo de vida (msdn.microsoft.com/en-us/library/ms178472.aspx) , al igual que el método page_load, y el marco ASP.Net manejará el envío de la respuesta al cliente automáticamente para nosotros (significa que no necesitamos controlar cuándo enviar datos y cuándo cerrar la conexión http subyacente), ¿correcto? – George2

6

Normalmente, no debería utilizar el método Response.Close en el procesamiento ASP.NET "normal".

Todos sus datos que se escriben en una "secuencia" HttpResponse se almacenan en el búfer antes de enviarse al navegador del cliente. El método Response.Close terminará abruptamente la conexión HTTP y puede perder datos que haya respondido previamente. Escrito inadvertidamente.

Si realmente quiere programación "fuerza" al final de una secuencia de respuesta, se debe utilizar ya sea: Response.Flush(); seguido por Response.End();

La llamada al método Response.Flush asegura que todos los datos que pueda haber escrito a la secuencia de respuesta se "purga" al cliente y Response.End garantiza que todos los datos almacenados en el búfer se envían correctamente al cliente, y también aumenta el evento EndRequest, que es posible que desee manejar.

También puede usar el método HttpApplication's CompleteRequest().

El MSDN documentation establece mejor:

Este método termina la conexión al cliente de una manera abrupta y no está diseñado para el procesamiento de solicitudes HTTP normal de . El método envía un paquete de reinicio al cliente, que puede hacer que los datos de respuesta que están almacenados en el buffer en el servidor, el cliente o en algún punto intermedio se eliminen.

Puede usar este método en la respuesta a un ataque de un cliente malicioso HTTP . Sin embargo, normalmente debe llamar a CompleteRequest() si desea ir al evento EndRequest y enviar una respuesta al cliente.

+0

Gracias CraigTP! Creo que solo necesitamos implementar todos los manejadores de fase/evento documentados en el enlace sobre el documento del ciclo de vida (http://msdn.microsoft.com/en-us/library/ms178472.aspx), y el marco subyacente ASP.Net cerrar la conexión automáticamente para nosotros, ¿correcto? Mi confusión anterior es (1) si no cerramos la respuesta, ¿hay alguna fuga? (2) si no cerramos, los datos de respuesta pueden almacenarse en el servidor y no enviarse al navegador del cliente de manera oportuna. ¿Algún comentario? – George2

+0

@ George2: Sí, el marco ASP.NET cerrará la conexión de HttpResponse para usted y se asegurará de que todos sus búferes se "vacíen" al hacerlo. No debería haber ninguna fuga en absoluto. He escrito datos manualmente en la secuencia HttpResponse (usando 'Response.Write') muchas veces sin cerrar explícitamente la conexión (usando' Response.Fin' u otras llamadas al método) y el marco de ASP.NET subyacente siempre ha limpiado correctamente sus búfers y ha enviado correctamente toda la secuencia de respuesta almacenada al navegador del cliente. – CraigTP