write net mensajes mandar como asp c# .net asp.net response

c# - net - HttpResponse.End vs HttpResponse.Close vs HttpResponse.SuppressContent



response c# (7)

¿Estás seguro de que la estrategia de diseño es correcta? ¿Qué preprocesamiento puede hacer para asegurarse de que se envían los encabezados correctos, y luego mantenerlo hasta que el guión haya dispensado sus objetivos?

Dentro de una página ASPX, quiero finalizar la respuesta en puntos específicos (no debido a una condición de error), dependiendo de la ruta del código, para que no se envíe nada más hacia atrás en la secuencia. Tan naturalmente usado:

Response.End();

Esto da como resultado una ThreadAbortException, que es por diseño .

Lo siguiente parece funcionar pero no parece el enfoque correcto según esta pregunta SO :

Response.Flush(); Response.Close();

Entonces, ¿qué tal esto?

Response.Flush(); Response.SuppressContent = true

y luego solo deja que la página se complete normalmente.

Podría manejar y tragar la ThreadAbortException, pero solo quiero saber si hay algún problema / errores con el enfoque SuppressContent.

Editar: Para dar un poco más de un ejemplo. Digamos que tengo una página ASPX por la cual puedo cambiar el tipo de contenido a una de varias posibilidades. Según el tipo de contenido y el escenario, en un punto dado del código quiero evitar que se envíe más contenido al cliente. Supongamos que después de que SuppressContent se establezca como verdadero, no hay problema con la ejecución de otro código del lado del servidor. Simplemente no quiero que se envíe nada más al cliente.

Editar 2: MiPágina.aspx - tiene una página maestra que puede incluir contenido estándar, encabezados, pies de página, etc. Esta página puede mostrarse como una página normal. También puede simplemente escribir un documento XML (por ejemplo) para descargar. Si escribe un documento XML (determinado en la carga de la página), borrará la salida, establecerá el tipo de contenido en XML, escribirá todo el XML y luego, si se deja normalmente, terminará con el resto de la representación de la página ASPX. añadido al final, eso obviamente no es necesario / rompe el XML.

Edición 3: por ahora estoy usando el enfoque SuppressContent. Para intentar finalizar esta pregunta, estoy generando una recompensa y plantearé la pregunta de otra forma: ¿cuándo deberías usar SuppressContent? ¿Por qué lo usarías en lugar de Response.End?

Consulte la respuesta que proporcioné a continuación para conocer la solución con la que finalmente terminé, ya que finalmente encontré una forma de evitar la excepción ThreadAbortException al utilizar Response.End. Ya había aceptado una respuesta en este punto.


¿Qué Response.SuppressContent = true si, después de llamar a Response.SuppressContent = true su página continúa realizando cambios en un registro en la base de datos?


Esta es una pregunta muy común. Y casi siempre es un error llamar a cualquier cosa excepto Response.End() . Aquí está la descripción de End() de MSDN:

Envía todos los resultados almacenados en el búfer al cliente, detiene la ejecución de la página y genera el evento EndRequest.

Esto parece ser exactamente lo que quieres hacer. Y notará en la última parte que plantea el evento EndRequest. Esto significa que después de llamar a End (), todos los datos se descargan al cliente que se escribió antes de End (), se cierra el socket y se liberan los recursos, y su programa deja de procesar la solicitud de inmediato.


Finalmente encontré una solución simple para usar Response.End () sin obtener una excepción ThreadAbortException.

Response.Flush(); Response.End();

De mi pregunta original, siempre he estado intentando SOLO una respuesta. Fin () después de enviar algo de contenido a la secuencia de respuesta.

Parece que si hay contenido no eliminado cuando haces Response.End (), obtienes la ThreadAbortException. Al hacer el color inmediatamente antes del final, ThreadAbortException no se lanza.

Parece que funciona muy bien: no se lanza ThreadAbortException ahora cuando uso Response.End


Por lo que puedo entender, el código al reflejar HttpResponse utilizando el enfoque Flush / SuppressContent lo hará vulnerable al código al tratar de hacer cambios en el encabezado después de la descarga. Cambiar un encabezado después de vaciar dará una HttpException.

Usaría Response.End () para estar absolutamente seguro de que nada más podría interferir con la respuesta.

Si desea continuar la ejecución pero también cortocircuitar la tubería http, considere usar Response.Flush () y HttpContext.Current.ApplicationInstance.CompleteRequest () como Response.End () cuando el contexto no está en un período cancelable.


Sé que esta es una vieja pregunta, pero estoy incluyendo esto para el beneficio de cualquiera que pueda tropezar con esta publicación. He estado persiguiendo un error que me llevó a revisar mi uso de Response.End, y descubrí una publicación de MSDN de un año después de esta pregunta que podría resumirse como " Nunca, nunca use Response.End ". Esto es lo que Thomas Marquardt, quien diseñó Integrated Pipeline para IIS7, dice al respecto:

El método End también está en mi lista "nunca usar". La mejor forma de detener la solicitud es llamar a HttpApplication.CompleteRequest. El método End solo está allí porque intentamos ser compatibles con ASP clásico cuando se lanzó 1.0. La ASP clásica tiene un método Response.End que finaliza el procesamiento de la secuencia de comandos ASP. Para imitar este comportamiento, el método End de ASP.NET intenta generar una ThreadAbortException. Si esto tiene éxito, el hilo de llamada será abortado (muy caro, no es bueno para el rendimiento) y la tubería saltará al evento EndRequest. ThreadAbortException, si tiene éxito, por supuesto significa que el hilo se desenrolla antes de que pueda llamar a más código, por lo que llamar a End significa que no llamará a ningún código después de eso. Si el método End no puede generar una ThreadAbortException, en su lugar vaciará los bytes de respuesta al cliente, pero lo hace de forma síncrona, lo que es realmente malo para el rendimiento, y cuando el código de usuario finaliza la ejecución, la tubería salta adelante a la notificación EndRequest. Escribir bytes para el cliente es una operación muy costosa, especialmente si el cliente se encuentra a la mitad del mundo y usa un módem de 56k, por lo que es mejor enviar los bytes de forma asíncrona, que es lo que hacemos cuando la solicitud finaliza de la manera normal. Enjuagar síncrono es realmente malo. Entonces, para resumir, no debería usar End, pero usar CompleteRequest está perfectamente bien. La documentación para End debe indicar que CompleteRequest es una mejor manera de saltar a la notificación de EndRequest y completar la solicitud.

De http://blogs.msdn.com/b/aspnetue/archive/2010/05/25/response-end-response-close-and-how-customer-feedback-helps-us-improve-msdn-documentation.aspx


actualización - advertencia: hay un método mejor, no lo use, ¡vea la respuesta de Ethan en su lugar!

No diría que hay una razón válida para evitar la respuesta. Fin. Querer evitar el costo de la ThreadAbortException, al permitir que el ciclo de solicitud de página continúe y que haga un trabajo adicional que no es necesario, no parece correcto.

ThreadAbortException es un tipo especial de excepción destinada a detener la ejecución de un hilo (se vuelve a lanzar automáticamente incluso si se detecta). Dicho esto, hay algunos escenarios en los que podría causar daños (consulte el contenido de la comunidad agregado al final de ThreadAbortException ).

A menos que se encuentre en uno de esos escenarios, debe apegarse a Response.End. Tenga en cuenta que algunos usos, hacer un SuppressContent & Response.End, supongo que en casos en los que quiera evitar algunas cosas que vendrían del Response.Flush interno.