ASP.Net MVC4 Mobile-Aware OutputCache

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

КОД:

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

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

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

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


person JamesEggers    schedule 07.03.2012    source источник


Ответы (2)


Немного покопавшись, я нашел решение проблемы.

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

[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);
}
person JamesEggers    schedule 07.03.2012
comment
Переключение на рабочий стол не работает с этим кодом. Страница просто обновляется, а не переключается. Вместо этого используйте context.GetVaryByCustomStringForOverriddenBrowser(). - person Pavel Chuchuva; 22.10.2013
comment
@PavelChuchuva какое-то время этот код не переключался на рабочий стол, почему? - person Moslem7026; 25.01.2020
comment
@Moslem7026 Понятия не имею, извините. Не могли бы вы попытаться достоверно воспроизвести эту проблему, а затем задать другой вопрос? - person Pavel Chuchuva; 27.01.2020
comment
@PavelChuchuva, к сожалению, я не могу воспроизвести, но иногда это происходит, загрузите мобильную кешированную версию для всех мобильных и настольных запросов. - person Moslem7026; 28.01.2020

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

public override string GetVaryByCustomString(HttpContext context, string custom)
    {
        if (custom.ToLowerInvariant() == "ismobile")
        {
            return context.GetVaryByCustomStringForOverriddenBrowser();
        }
        return base.GetVaryByCustomString(context, custom);
    }
person Thanh Tung    schedule 04.01.2013
comment
иногда он блокируется на мобильном телефоне и не переключается на рабочий стол - person Moslem7026; 25.01.2020