ASP.NET el filtrado de respuestas y la sustitución posterior a la memoria caché no son compatibles

Este artículo le ayuda a resolver el problema que se produce al usar el filtrado de respuestas y la sustitución posterior a la memoria caché al mismo tiempo.

Versión original del producto:   Internet Information Services 7.0 y versiones posteriores
Número KB original:   2014472

Síntomas

Imagine la siguiente situación:

  1. Tiene una aplicación ASP.NET que se ejecuta en IIS 7.0 o una versión posterior.
  2. La aplicación usa la sustitución posterior a la caché.
  3. La aplicación también usa un módulo de filtro de protocolo de transferencia de hipertexto (HTTP) para filtrar el contenido representado.

En este escenario, puede producirse uno de los siguientes problemas:

  • Si la aplicación se hospeda en IIS7 en modo de canalización clásica, los bloques de sustitución solo se representan en la primera solicitud. Los siguientes accesos a la página hacen que la página completa se sirve desde la memoria caché de resultados y que los bloques de sustitución no se actualicen.

  • Si la aplicación está hospedada en IIS7 en modo de canalización integrada, se produce una excepción de tipo System.InvalidOperationException con los siguientes detalles:

    Detalles de la excepción: System.InvalidOperationException: la sustitución posterior a la caché no es compatible con los módulos de la canalización integrada de IIS que modifican los búferes de respuesta. Un módulo nativo de la canalización ha modificado una estructura HTTP_DATA_CHUNK asociada con una devolución de llamada de sustitución de caché posterior administrada o un filtro administrado ha modificado la respuesta.

Causa

El filtrado de respuesta y la sustitución posterior a la memoria caché no son compatibles.

Solución

Para evitar el problema, use una de las siguientes opciones:

  • Deshabilitar el almacenamiento en caché de resultados en las páginas que usan bloques de sustitución.
  • No use el módulo de filtro de respuesta.

Más información

La sustitución posterior a la memoria caché se implementa mediante una lista de bloques de sustitución (delegados .NET) usados para reconstruir partes individuales de la respuesta. ASP.NET mantiene internamente una lista de estructuras asociadas con una devolución de llamada de sustitución posterior HTTP_DATA_CHUNK a la caché administrada. Cuando se usa un filtro de respuesta, una respuesta sin procesar se representa en un único búfer y se pierde la lista de bloques de sustitución. Por lo tanto, los bloques de sustitución no se pueden representar. Para obtener más información sobre la sustitución posterior a la memoria caché, vea El almacenamiento en caché de partes de una página ASP.NET caché.