ASP.NET MVC 4中的移动显示模式在大约一个小时的正常运行时间后停止提供正确的视图,尽管浏览器覆盖正确地检测到被覆盖的移动设备。
回收应用程序池临时解决问题。
新的浏览器覆盖功能正确地允许移动设备查看网站的桌面版本,反之亦然。但在大约一个小时的正常运行时间后,移动视图不再为移动设备呈现;仅渲染默认桌面Razor模板。唯一的解决方案是回收应用程序池。
奇怪的是,浏览器覆盖cookie继续工作。主_Layout.cshtml模板根据ViewContext.HttpContext.GetOverriddenBrowser()。IsMobileDevice的值正确显示“移动”或“桌面”文本,但是错误的视图仍在呈现。这使我相信问题在于DisplayModes。
有问题的操作未缓存:
[OutputCache(NoStore = true,Duration = 0,VaryByParam = "*")]
我使用51Degrees的移动检测,但我不认为这应该影响重写的移动检测。这是一个Bug的DisplayModes功能为ASP.NET MVC 4 Beta&开发者预览,还是我做别的什么错了?
这里是我的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 });
解决方法
这是MVC 4中的一个已知问题(Codeplex:
#280: Multiple DisplayModes – Caching error,will show wrong View)。这将在下一个版本的MVC中修复。
在此期间,您可以安装一个可用的解决方案包:http://nuget.org/packages/Microsoft.AspNet.Mvc.FixedDisplayModes。
对于大多数应用程序,只需安装此软件包即可解决此问题。
对于定制注册视图引擎集合的一些应用程序,您应该确保引用Microsoft.Web.Mvc.FixedRazorViewEngine或Microsoft.Web.Mvc.FixedWebFormViewEngine,而不是默认的视图引擎实现。