OuputCache, есть ли способ отличить вошедших в систему и анонимных пользователей

У меня есть сайт MVC .net, и я пытаюсь использовать OutputCache для повышения производительности.

/// <summary>
/// Broker View Page
/// </summary>
/// <returns></returns>
[Route("{lang}/brokers/details/{id}/{code}", Order = 1)]
[Route("brokers/details/{id}/{code}", Order = 2)]
[OutputCache(Duration = (60 * 60), VaryByParam = "none")]
public ActionResult View(int? id, string code)
{

Это обеспечивает огромный выигрыш в производительности при втором и последующих посещениях сайта, но я только что обнаружил один огромный недочёт!

Если клиент посещает страницу анонимно, затем входит в систему и возвращается на страницу, он все равно получает доступ к просмотру без аутентификации (аутентифицированные клиенты должны видеть то же содержимое, но другой заголовок)

Можно ли использовать OutputCache, чтобы сохранить прирост производительности, но достаточно ли он умен, чтобы знать о различиях между аутентифицированным и не прошедшим аутентификацию?

1 ответ

Решение

Вы можете использовать "VaryByCustom"

В контроллере

    [OutputCache(Duration = 1000, VaryByCustom = "user")]
    public ActionResult Index()
    {
        return View();
    }

В Global.ascx.cs:

    public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (custom == "user")
        {
            if (context.Request.IsAuthenticated)
            {
                return context.User.Identity.Name;
            }
        }

        return "anonymous"
    }

Каждый пользователь получает свою уникальную версию в кешированной версии, и для "анонимных" пользователей также создается кешированная версия.

Другие вопросы по тегам