Фильтр ответов ASP.NET MVC + атрибут OutputCache - PullRequest
5 голосов
/ 29 октября 2009

Я не уверен, относится ли это к ASP.NET MVC или к ASP.NET в целом, но вот что происходит. У меня есть фильтр действий, который удаляет пробелы с помощью фильтра ответов:

public class StripWhitespaceAttribute : ActionFilterAttribute
{
    public StripWhitespaceAttribute ()
    {

    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        base.OnResultExecuted(filterContext);

        filterContext.HttpContext.Response.Filter = new WhitespaceFilter(filterContext.HttpContext.Response.Filter);
    }
}

Когда используется в сочетании с атрибутом OutputCache, мои вызовы Response.WriteSubstitution для "кэширования пончиковых отверстий" не работают. Первый и второй раз, когда страница загружает обратный вызов, переданный в WriteSubstitution, вызывается, после этого они больше не вызываются до истечения срока действия кэша вывода. Я заметил это не только с этим конкретным фильтром, но и с любым фильтром, используемым в Response.Filter ... я что-то упустил?

Я также забыл упомянуть, что пытался сделать это без использования атрибута фильтра действий MVC, прикрепив к событию PostReleaseRequestState в global.asax и установив там значение Response.Filter ... но все равно не повезло. 1006 *

Ответы [ 2 ]

3 голосов
/ 03 апреля 2010

Эта статья KB может дать некоторое представление об основной причине этой проблемы. Хотя фильтр «нарушает» кеширование в IIS6, он выдает ошибку в IIS 7. Похоже, в лучшем случае это улучшение времени проектирования / тестирования.

UPDATE

Вот официальный ответ от MS Dev Support по этому вопросу.

Вопрос:
Какая альтернатива фильтрации ответов в ASP.NET для изменения HTML, отображаемого другим процессом, когда:
1. Другой процесс не может быть изменен
2. Подстановка после кэширования должна поддерживаться

Ответ:
«Да, ваш вопрос ясен как голубое небо, и официально заявлено, что он не поддерживается. Поскольку замена после кэширования объединяет определенные блоки подстановки с байтами ответа, тогда как фильтрация ответов предполагает фильтрацию необработанных байтов ответа (без изменений). Таким образом, ранее объединенные блоки подстановки больше не могут быть сохранены.

Альтернативы от Microsoft пока нет. "

2 голосов
/ 29 октября 2009

AFAIK, проблема в том, что фильтры действий не выполняются, если запрос поступает в выходной кэш. AuthorizeAttribute решает эту проблему, вызывая какой-то непонятный API выходного кэша. Однако я не думаю, что это лучшее решение для того, что вы пытаетесь сделать.

Вы должны работать с кэшем вывода, а не вокруг него. Вместо этого вам следует убедиться, что пробелы удалены из ответа, прежде чем он будет сохранен в выходном кэше.

Обновление

Кажется, что присоединение фильтра, независимо от того, какой фильтр, отключает функцию WriteSubstitution, как вы подозреваете. Я попытался проследить след в классе HttpResponse, используя отражатель, но не могу найти никаких доказательств, подтверждающих это подозрение. Я думаю, что ответ лежит в классе HttpWriter.

Другое обновление

Так получилось, что я сейчас читаю превосходную книгу "Pro ASP.NET MVC Framework" Стива Сандерсона (купите ее, если у вас ее еще нет). В главе 10 он ссылается на пост в своем блоге , где рассказывает о частичном кэшировании вывода и плохой интеграции между инфраструктурой MVC и выходным кэшем. Я еще не пробовал пользовательский атрибут outputcache в посте ... Я попробую его и сообщу, если он что-то решит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...