ARR: deshabilita dinámicamente el almacenamiento en caché del disco para ciertas solicitudes (usuarios autenticados)

ARR: deshabilita dinámicamente el almacenamiento en caché del disco para ciertas solicitudes (usuarios autenticados)

Se trata del enrutamiento de solicitudes de aplicaciones y de la desactivación dinámica del almacenamiento en caché del disco para ciertas solicitudes (cuando las solicitudes provienen de usuarios autenticados; si están autenticados se puede decidir mediante un código personalizado).

En mi configuración hay un servidor que ejecuta ARR y envía solicitudes a un sitio ASP.NET MVC en un servidor diferente. El sitio utiliza autenticación de formularios (y a veces autenticación básica HTTP), por lo que la autenticación ocurre en el sitio MVC, no en ARR: básicamente, cuando el usuario se autentica, el sitio crea una cookie de autenticación de formularios.

Me gustaría que sucediera lo siguiente en ARR:

  • Realice almacenamiento en caché de resultados para usuarios anónimos.
  • Para usuarios autenticados, solo almacene en caché archivos estáticos (por ejemplo, archivos .css, .js, .jpg) y no almacene en caché páginas dinámicas.

¿Cómo es posible tener una regla de configuración de caché para este escenario? Lo he intentado de varias maneras:

  • Encabezados de caché: los encabezados de control de caché enviados por la aplicación MVC no se pueden utilizar aquí, porque imagina esto: la página 1 está en el caché de ARR. El usuario se autentica y visita la página 1. La aplicación MVC enviaría un encabezado sin caché pero la solicitud no llega, por lo que el usuario obtiene la versión almacenada en caché.
  • URL sin caché: pensé que probablemente definir que las URL con "no-arr-cache" no deberían almacenarse en caché funcionaría con la reescritura de URL, es decir, con un proveedor de reescritura de URL personalizado al que reescribiría solicitudes autenticadas... sin caché. Aparte de que las reglas de control de caché de ARR no se preocupan por las cadenas de consulta, el problema es que ARR solo tiene en cuenta las URL solicitadas cuando se evalúa una regla de configuración de caché, no la URL reescrita.

¡Gracias de antemano!

Publiqué esto desde elForos de IISporque nadie respondió allí.

Respuesta1

Así lo resolví.

Tenemos que tener en cuenta las siguientes premisas:

  • ARR identifica los elementos almacenados en caché con su URL (que, según la configuración, incluye la cadena de consulta; esta debería ser la configuración).
  • Durante una solicitud, se puede indicar a ARR que no almacene en caché el resultado de la solicitud actual.
  • Si la salida de la solicitud actual (URL) se almacenó en caché antes, no conozco ninguna forma de indicarle a ARR que no use la versión en caché.

La gran idea es cambiar la URL de la solicitud, o mejor dicho, reescribirla de manera diferente con IIS URL Rewrite dependiendo de si el usuario está autenticado o no. Los usuarios no autenticados obtienen todas las páginas servidas con, por ejemplo, /my-page?authenticated=false y las autenticadas con /my-page?authenticated=true. Las páginas se almacenarán en caché solo para usuarios anónimos, por lo que ARR no encontrará ninguna entrada de caché coincidente para usuarios autenticados. Así, el tercer punto queda solucionado. La desventaja es que la cadena de consulta que adjunta a las URL puede aparecer en el cuerpo HTML; estas deben eliminarse con IIS URL Rewrite.

Para indicarle a ARR que no almacene en caché la solicitud actual, establezca la variable del servidor ARR_CACHE_CONTROL_OVERRIDE en "1,no-cache" (puede hacerlo desde las reglas de reescritura).

Puede detectar si el usuario está autenticado desde una URL de IIS Rewrite IRewriteProvider (consultetutorial), es decir, puede utilizar la salida de dicho proveedor para reescribir la URL de forma diferente para usuarios autenticados y anónimos.

Espero que eso ayude a alguien.

información relacionada