Подтвердить что ты не робот

ASP.Net MVC4 Mobile-Aware OutputCache

Я работаю над обновлением приложения от MVC3 до MVC4 и заметил, что что-то, что я предположил (надеялся?), "просто сработает".

CODE:

[OutputCache(Duration = 600, VaryByParam = "none")]
public ActionResult Index()
{
   return View();
}

Это пример кэширования учебников для ASP.Net. Всякий раз, когда браузер попадает на страницу, он проверяет кеш, чтобы узнать, существует ли что-то, генерирует представление, если нет, а затем отправляет кешированные результаты.

Это отлично работает; однако, играя с функцией Mobile view MVC4, я заметил, что приведенный выше код не проверяет, является ли запрос с мобильного устройства. Поэтому, если я удалю по этому маршруту на рабочем столе, на рабочем столе будет отображаться рабочий стол, пока кеш не будет отменен. Обратное также верно (если я впервые попал на страницу с телефоном, рабочий стол увидит вместо этого мобильный вид).

Есть ли параметр, который я мог бы использовать для выполнения этой работы, как я надеялся, или я смотрю на создание клиента OutputCacheProvider?

4b9b3361

Ответ 1

После немного более глубокой обработки я нашел решение проблемы.

Обновлено действие контроллера

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

Переопределить GetVaryByCustomString в Global.asax

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom.ToLowerInvariant() == "ismobile" && context.Request.Browser.IsMobileDevice)
    {
        return "mobile";
    }
    return base.GetVaryByCustomString(context, custom);
}

Ответ 2

Это правильный метод GetVaryByCustomString

public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (custom.ToLowerInvariant() == "ismobile")
        {
            return context.GetVaryByCustomStringForOverriddenBrowser();
        }
        return base.GetVaryByCustomString(context, custom);
    }