Pregunta

Mientras que la escritura de una costumbre IHttpHandler me llegó a través de un comportamiento que no me esperaba sobre la HttpCachePolicy objeto.

Mi controlador calcula y define una entidad etiqueta (utilizando el SetETag método en el HttpCachePolicy asociados con la respuesta actual de objeto).Si puedo configurar la cache-control público a través de la SetCacheability método todo funciona como un encanto y el servidor envía a lo largo de la e-etiqueta de encabezado.Si me puse privada en el e-etiqueta de encabezado será suprimida.

Tal vez no he buscado bastante difícil pero no he visto nada en el HTTP/1.1 especificaciones que podrían justificar este comportamiento.¿Por qué no desea enviar E-Etiqueta de navegadores, mientras que todavía se prohíbe a los servidores proxy de almacenamiento de datos?

using System;
using System.Web;

public class Handler : IHttpHandler {
    public void ProcessRequest (HttpContext ctx) {
        ctx.Response.Cache.SetCacheability(HttpCacheability.Private);
        ctx.Response.Cache.SetETag("\"static\"");
        ctx.Response.ContentType = "text/plain";
        ctx.Response.Write("Hello World");
    }

    public bool IsReusable { get { return true; } }
}

Volverá

Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 11

Pero si cambiamos al público que va a volver

Cache-Control: public
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Etag: "static"

Me he encontrado esto en el ASP.NET servidor de desarrollo y de IIS6, de momento, con los mismos resultados.También yo soy incapaz de establecer de forma explícita el uso de la etiqueta ETag

Response.AppendHeader("ETag", "static")

Actualización:Es posible anexar la cabecera ETag manualmente cuando se ejecuta en IIS7, sospecho que esto es causado por la estrecha integración entre ASP.NET y el IIS7 tubería.

Aclaración:Es una pregunta larga pero el núcleo de la cuestión es este: ¿por qué ASP.NET hacer esto, ¿cómo puedo conseguir alrededor de él y debo?

Actualización:Voy a aceptar Tony respuesta puesto que es esencialmente correcto (ir a Tony!).He encontrado que si usted quiere emular la HttpCacheability.Privado totalmente puede configurar el almacenamiento en caché para ServerAndPrivate pero usted también tiene la caché de la llamada.SetOmitVaryStar(verdadero) de lo contrario la caché agregar el Variar:* encabezado de la salida y usted no quiere eso.Voy a editar que en la respuesta cuando me permisos de edición (o si usted ve esta Tony tal vez usted podría editar su respuesta a incluir esa llamada?)

¿Fue útil?

Solución

Creo que usted necesita para utilizar HttpCacheability.ServerAndPrivate

Que debe darle cache-control:privado en los encabezados y permiten establecer un ETag.

La documentación que se necesita para ser un poco mejor.

Editar: Markus encuentra que usted también tiene la caché de la llamada.SetOmitVaryStar(verdadero) de lo contrario la caché agregar el Variar:* encabezado de la salida y usted no quiere eso.

Otros consejos

Desafortunadamente, si usted mira en System.Web.HttpCachePolicy.UpdateCachedHeaders() en .NET Reflector que ver que hay una instrucción if específicamente, la comprobación de que el Almacenamiento no es Privado antes de hacer cualquier ETag cosas.En cualquier caso, yo siempre he encontrado que Last-Modified/If-Modified-Since funciona bien para nuestros datos y es un poco más fácil de controlar en el Violinista de todos modos.

Si como yo, usted está satisfecho con la solución que se ha mencionado aquí de utilizar el Almacenamiento en caché.ServerAndPrivate, y usted realmente quiere para su uso Privado en su lugar - tal vez debido a que son la personalización de las páginas de forma individual para los usuarios y no tiene sentido en caché en el servidor, a continuación, al menos en .NET 3.5 se puede establecer ETag a través de la Respuesta.Los encabezados.Agregar y este funciona bien.

N. B.si usted hace esto usted tiene que aplicar la comparación de el cliente los encabezados de sí mismo y del HTTP de respuesta 304 manejo - no estoy seguro de si .NET se encarga de ello en circunstancias normales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top