检查移动设备是不是正在请求桌面站点

Posted

技术标签:

【中文标题】检查移动设备是不是正在请求桌面站点【英文标题】:Check if a mobile device is requesting the desktop site检查移动设备是否正在请求桌面站点 【发布时间】: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 请求的用户代理并从中读取。 是否没有内置方式,当我搜索时,我遇到了可以显式设置覆盖浏览器的地方:***.com/questions/16080593/…。如果可以设置,是不是就没有办法获取了? hmmm,在查看了更多浏览器覆盖后,似乎覆盖只是由 const 字符串设置:github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/… 当用户请求桌面站点时,为什么不设置 cookie 呢?然后读取 cookie,并进行相应的更改。 @krillgar 在看到业余爱好者的更新后进行了更多测试,我的问题是,如果用户直接通过移动设备请求桌面站点,则该设备被归类为桌面设备,这样会带来我回到最初的问题 - 你如何判断它是否是请求桌面站点的移动设备? - ps不是网站上要求桌面版的按钮,是手机上的设置 【参考方案1】:

在我看来,如果您将缓存存储在 客户端 端,您正在做的事情应该可以工作。

您应该按以下方式在控制器操作上使用 OutputCache 属性:

[OutputCache(Duration = 5, VaryByCustom = "Mobile", Location = OutputCacheLocation.Client)]

(时间长短由你决定)

话虽如此,浏览器检测是基于 HTTP 标头的,因此如果请求浏览器正在为不同的代理发送标头,则没有任何帮助。

另一种选择是使用特征检测。

希望对你有帮助。

【讨论】:

【参考方案2】:

在 51degrees.config 中有一个设置

 <redirect devicesFile="" timeout="20" firstRequestOnly="true"

此 firstrequestonly 可能会混淆您的缓存系统,因此将第一台移动设备视为第一个请求,并将所有其他移动设备视为原始移动设备的同一会话。尝试将此设置为 false,看看这是否有助于解决您的问题。

【讨论】:

以上是关于检查移动设备是不是正在请求桌面站点的主要内容,如果未能解决你的问题,请参考以下文章

带有桌面站点视图的移动设备上元素的绝对高度和宽度为100%

检测到 Googlebot Desktop 为移动设备

如何在我的 Windows 桌面上运行 localhost 的移动设备上运行我的 Angular 站点[重复]

为啥我的图片只能在桌面上加载,而不能在移动设备上加载?

pushManager 未在移动设备上请求许可

将移动友好站点重定向到桌面客户端