¿Por qué HttpCacheability.Private suprime ETags?

Mientras escribía un IHttpHandler personalizado, me encontré con un comportamiento que no esperaba con respecto al objeto HttpCachePolicy.

Mi controlador calcula y establece una etiqueta de entidad (usando el método SetETag en la HttpCachePolicy asociada con el objeto de respuesta actual). Si configuro el control de caché en público usando el método SetCacheability, todo funciona como un encanto y el servidor envía junto con el encabezado de la etiqueta electrónica. Si lo configuro como privado, se eliminará el encabezado de la etiqueta electrónica.

Tal vez simplemente no he buscado lo suficiente pero no he visto nada en la especificación HTTP / 1.1 que justifique este comportamiento. ¿Por qué no querrías enviar E-Tag a los navegadores y al mismo tiempo prohibir que los proxies almacenen los 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; } }
}

Volveremos

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

Pero si lo cambiamos a público, volverá

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

He ejecutado esto en el servidor de desarrollo ASP.NET e IIS6 hasta ahora con los mismos resultados. Además, no puedo configurar explícitamente el ETag usando

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

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

Aclaración: Es una pregunta larga pero la pregunta central es esta:¿Por qué ASP.NET hace esto? ¿Cómo puedo evitarlo y debo hacerlo?

Actualizar: Voy a aceptarLa respuesta de Tony ya que es esencialmente correcto (¡vaya Tony!). Descubrí que si desea emular HttpCacheability.Private completamente, puede configurar la capacidad de almacenamiento en caché en ServerAndPrivate, pero también tiene caché de llamadas.SetOmitVaryStar(verdadero) de lo contrario el caché agregará elVariar: * encabezado a la salida y no quieres eso. Lo editaré en la respuesta cuando obtenga permisos de edición (o si ve a este Tony, ¿tal vez podría editar su respuesta para incluir esa llamada?)

Respuestas a la pregunta(3)

Su respuesta a la pregunta