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