2010-09-21 41 views
10

Agregué encabezados a una página de la siguiente manera: Page.Response.AddHeader ("foo", "bar");Detecta que los encabezados http de asp.net ya se enviaron

Dependiendo del procesamiento anterior, a veces esto falla con "El servidor no puede agregar el encabezado después de que se han enviado los encabezados HTTP". Estoy lidiando con esto al adjuntar Page.Response.AddHeader ("foo", "bar"); dentro de una construcción try-catch. Sin embargo, para mantener las cosas más limpias y evitar generar una excepción, ¿hay alguna manera de detectar que los encabezados ya han sido enviados? (Por cierto, si lo intento evaluar Page.Response.Headers luego me sale el siguiente error: "Esta operación requiere modo de canalización integrada de IIS")

Gracias

+0

Para el almacenamiento en caché use Page.Response.Cache – gandjustas

+0

Lo he visto antes. Debe explicar qué tecnologías está utilizando: almacenamiento en caché, AJAX, MVC, ... y en qué parte del código está agregando este encabezado para que podamos ayudarlo. – Aliostad

Respuesta

6

Por desgracia, mientras que el objeto HttpResponse tiene una propiedad llamada HeadersWritten, y un campo de respaldo llamada _headersWritten, ninguno de ellos son accesibles desde el exterior del conjunto de System.Web - a menos que use Reflection. No estoy seguro de lo que crees que podrás obtener de la colección Encabezados, puede existir o no, independientemente de si ya se han enviado los encabezados.

Si desea utilizar Reflection, puede tener sus propias penalizaciones de rendimiento, y requerirá que su aplicación se ejecute con plena confianza.

Todos los métodos de acceso público en HttpResponse que involucran el campo _headersWritten parecen usarlo para lanzar una excepción.

+0

+1 buena observación. Creo que el trabajo fue el que sugerí. – Aliostad

+0

Mientras tanto [.Net ha hecho que HeadersWritten sea público desde Framework 4.5.2] (https://stackoverflow.com/a/36206613/2418006) – OneManBand

13

Puede utilizar un HttpModule para registrarse en el evento PreSendRequestHeaders. Cuando se llame, escriba un valor en HttpContext.Current.Items que indique que se están enviando los encabezados, y luego en cualquier otro lugar de su código, verifique el valor en HttpContext.Current.Items para ver si se ha enviado aún.

+0

Parece que esto podría haber resuelto el mismo problema que estamos teniendo. ¡Gracias! – anthonyv

+2

Si puede cambiar a .NET 4.5.2 debería usar 'HttpResponseBase.AddOnSendingHeaders' en su lugar. [enlace] (http://msdn.microsoft.com/en-us/library/system.web.httpresponsebase.addonsendingheaders.aspx) – drphrozen

6

A partir de .NET 4.5.2, puede hacerlo utilizando la propiedad ahora HeadersWritten pública de HttpResponse (ver the msdn docs):

if (HttpContext.Current.Response.HeadersWritten) { ... } 
0

He usado HttpContext.Current.Response.Headers. Conde, cuando se envían los aumentos totales del encabezado; solo puede aplicar una declaración If si es necesario.

Cuestiones relacionadas