Вдохновленный отправленной вами Link1 , так как простая в коде идея состоит в том, что вы можете изменить вывод переопределения GetVaryByCustomString следующим образом:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "IsLoggedIn")
{
if (context.Request.Cookies["anon"] != null)
{
if (context.Request.Cookies["anon"].Value == "false")
{
return "auth";
}
}
return Guid.New().ToString();
}
else
{
return base.GetVaryByCustomString(context, arg);
}
}
На самом деле это не ответ, поскольку технически выходные данные аутентифицированного пользователя будут по-прежнему кэшироваться, но они удовлетворяют требованию, чтобы аутентифицированные пользователи видели все результаты сразу. Недостатком является то, что вам нужно поддерживать длительность кэша / TTL достаточно маленькой, чтобы ваш кэш не заполнялся, а был достаточно большим, чтобы анонимные пользователи могли извлечь из этого выгоду.
Другая альтернатива - написать собственный фильтр действий для кэширования и добавить туда поддержку только для анонимного кэширования. Это гораздо больше, однако, на своей собственной территории. См. старый пост Клопфенштейна или Стива Сандерсона по этому вопросу в качестве отправной точки. Им не хватает многих других возможностей OutputCache (например, он использует ключи для всех данных маршрута), но вы можете заставить его работать в соответствии с вашими спецификациями.