【发布时间】:2016-08-22 10:01:22
【问题描述】:
我在我的 MVC 网站上使用 51 度作为为我的页面提供服务的自适应方法。一切正常。
我最近添加了输出缓存,我使用VaryByCustom 来检查它是移动设备还是桌面设备:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
// this is for the output cache
if (context != null)
{
switch (custom)
{
case "Mobile":
return GetMobileCustomString(context);
}
}
return base.GetVaryByCustomString(context, custom);
}
private static string GetMobileCustomString(HttpContext context)
{
if (context.Request.Browser.IsMobileDevice)
{
return "IsMobile";
}
else
{
return "IsDesktop";
}
}
但是我遇到了一个问题,如果第一个浏览该网站的移动用户请求了桌面版本,则会为所有移动用户缓存。
我需要更改 GetMobileCustomString 以检查它是否是请求桌面站点的移动设备。有没有办法做到这一点?
更新
由于已为此打开赏金,我想我会提供更新:
首先,这并不是我最初想的那样导致桌面页面被缓存的第一次加载,所以在这方面做了很多搜索、研究和测试,我觉得桌面页面不应该被缓存到移动设备上版本(如果您使用的是 MVC 5)。在执行移动请求时,我已经逐步完成了代码,当它通过自定义到达时,它将 context.Request.Browser.IsMobileDevice 显示为 false。
不确定是什么导致桌面网站为移动网站缓存 - 可能是 bug in MVC 4 的遗留问题。它似乎是随机的(即有一天它会很好,然后另一天它会出于某种原因为桌面站点提供服务)并且回收应用程序池将始终修复它。
我还发现我可以通过以下方式获取覆盖的浏览器:
using System.Web.Wepages;
context.Request.RequestContext.HttpContext.GetOverriddenBrowser();
不过好像没多大用处
【问题讨论】:
-
您是否有权更改桌面/移动应用程序和请求?也许您可以设置 http 请求的用户代理并从中读取。
-
是否没有内置方式,当我搜索时,我遇到了可以显式设置覆盖浏览器的地方:stackoverflow.com/questions/16080593/…。如果可以设置,是不是就没有办法获取了?
-
hmmm,在查看了更多浏览器覆盖后,似乎覆盖只是由 const 字符串设置:github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/…
-
当用户请求桌面站点时,为什么不设置 cookie 呢?然后读取 cookie,并进行相应的更改。
-
@krillgar 在看到业余爱好者的更新后进行了更多测试,我的问题是,如果用户直接通过移动设备请求桌面站点,则该设备被归类为桌面设备,这样会带来我回到最初的问题 - 你如何判断它是否是请求桌面站点的移动设备? - ps不是网站上要求桌面版的按钮,是手机上的设置
标签: c# asp.net-mvc 51degrees