Режимы мобильного отображения в ASP.NET MVC 4 перестают отображать правильные представления примерно через час безотказной работы, несмотря на то, что браузер корректно обнаруживает переопределенное мобильное устройство.
Переработка пула приложений временно решает проблему.
Новая функция переопределения браузера позволяет мобильным устройствам просматривать настольную версию сайта и наоборот.Но примерно через час безотказной работы мобильные представления больше не отображаются для мобильного устройства;отображаются только стандартные шаблоны Razor для рабочего стола.Единственное исправление - перезапуск пула приложений.
Как ни странно, cookie переопределения браузера продолжает функционировать.Главный шаблон _Layout.cshtml
правильно отображает текст «мобильный» или «рабочий стол» в зависимости от значения ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice
, но неправильные представления по-прежнему отображаются.Это заставляет меня поверить, что проблема заключается в DisplayModes.
Действие не кэшируется:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
Я использую 51Degrees для обнаружения мобильных устройств, но я не думаю, чтоэто должно повлиять на переопределенное мобильное обнаружение.Это ошибка в функции DisplayModes
для ASP.NET MVC 4 Beta & Developer Preview, или я делаю что-то еще неправильно?
Вот моя DisplayModes
настройка в Application_Start
:
DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone")
{
ContextCondition = context =>
context.GetOverriddenBrowser().IsMobileDevice
&& (context.Request.UserAgent.IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0
|| context.Request.UserAgent.IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0
|| !context.Request.Browser.IsMobileDevice)
});
/* Looks complicated, but renders Home.iPhone.cshtml if the overriding browser is
mobile or if the "real" browser is on an iPhone or Android. This falls through
to the next instance Home.Mobile.cshtml for more basic phones like BlackBerry.
*/
DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Mobile")
{
ContextCondition = context =>
context.GetOverriddenBrowser().IsMobileDevice
});