Мобильные режимы отображения в 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
});