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

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

Versión del producto original:   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 accesos a páginas posteriores hacen que la página completa se pueda servir desde la memoria caché de salida y que los bloques de sustitución no se actualicen.

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

    Detalles de excepción: System.InvalidOperationException: La sustitución de caché posterior 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 a 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 caché no son compatibles.

Solución

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

  • Deshabilite 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 caché se implementa con una lista de bloques de sustitución (delegados de .NET) que se usan 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 administrada HTTP_DATA_CHUNK posterior a la caché. Cuando se usa un filtro de respuesta, una respuesta sin procesar se representa en un solo 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 caché, vea Caching Portions of an ASP.NET Page.