Tengo un método de acción MVC4 GET que devuelve FileStreamResult. Un requisito existe para sólo utilizan SSL y para no permitir el almacenamiento en caché del documento servido tan SSL que es y también he utilizado el filtro OutputCache con las siguientes propiedades:¿Es posible eliminar un encabezado de respuesta Pragma sin caché una vez que se haya establecido mediante el método SetCacheability?
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None", Location = OutputCacheLocation.None)]
Esto se comporta como se esperaba y produce la siguiente respuesta encabezados:
Cache-Control: no-cache, no-store
Expires: -1
Pragma: no-cache
Todo fue bien hasta que les pide que apoyen también IE8 y como muchos aquí también se han encontrado con los documentos simplemente no descargarán tanto con no-cache establecer y SSL en la mezcla. El wordaround para IE8 y abajo es para agregar alguna configuración de registro que no es realmente viable, o para eliminar los encabezados sin caché que rompe un requisito fundamental.
Experimenté con Fiddler e IE8 y pude descargar un documento si simplemente eliminaba el pragma: encabezado sin caché pero dejaba intacto el control de caché. Esto no parece dejar una copia del documento en mis archivos temporales de Internet, pero podría necesitar probar esto un poco más.
Con esta información en mente, pensé que podría ser una tarea sencilla eliminar el pragma usando un filtro en la acción, pero parece que no importa lo que haga, no puedo cambiar lo que OutputCache vaya a establecer. Incluso me he quitado el atributo OutputCache y utilicé:
Response.Cache.SetCacheability(HttpCacheability.NoCache)
uso de este método solo asegura consigo los mismos valores de caché como antes, pero que no se han fijado en el punto de esta llamada al método. Esto simplemente configura la política de caché que se aplica en algún punto de la canalización de respuesta, pero no sé dónde.
¿Alguien sabe si hay una forma de engancharse en la tubería de respuesta para alterar los encabezados de la memoria caché a medida que se escriben?
EDITAR He añadido un simple encargo IHttpModule en la tubería que busca y elimina cualquier encabezado Pragma en el NameValueCollection respuesta y mientras se establece el control de caché del pragma no está allí. ¿Esto significa que IIS 7.5 está insertando el pragma en sí mismo en función de lo que ve en el control de caché, tal vez? Sé con certeza que no he establecido nada más allá de los valores predeterminados para un sitio web simple.
EDITAR comprobado el valor de la cabecera Cache-Control en el módulo y que se fija privada por lo que las cabeceras de caché no se han aplicado a la respuesta todavía. ¿Entonces parece que los encabezados de la caché se agregan después de que se ejecuten los módulos quizás?
FWIW, es posible que desee leer esto: http://blogs.msdn.com/b/ieinternals/archive/2009/10/03/internet-explorer-cannot-download-over-https-when-no- cache.aspx. Incluso con los encabezados de No-Cache establecidos, la respuesta generalmente terminará en un archivo temporal en el disco; idealmente será limpiado en breve, pero no hay garantía de eso. – EricLaw
Gracias EricLaw. Me encontré con ese artículo en mis búsquedas, que es lo que me impulsó a usar el violín para modificar los encabezados de respuesta antes de que el navegador reciba la transmisión. Esto fue cuando noté que al no incluir el pragma pero dejando intacto el control de caché, el archivo se descargaba pero no podía verlo en la carpeta Archivos de Internet temporales. Todavía creo que necesito volver a probar esto para estar seguro de que no está en la memoria caché. – Mark
Tengo un [problema similar] (http://stackoverflow.com/questions/13119340/ie6-8-unable-to-download-from-https-site) y no pude encontrar una manera de hacer 'Response .Cache.SetCacheability' work - siempre agrega el encabezado 'Pragma' y siempre pone' no-cache' antes 'no-store'. Sin embargo, eso debería ser controlable: a menos que estés lidiando con IE3/Netscape Navigator, enviar el encabezado 'Pragma' es bastante inútil. – Keith