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

时间:2016-08-22 10:01:23

标签: c# asp.net-mvc 51degrees

我在我的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();

但它似乎没什么用处

2 个答案:

答案 0 :(得分:0)

在我看来,如果您将缓存存储在客户端端,那么您正在做的事情应该有效。

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

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

(持续时间取决于你)

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

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

我希望有所帮助。

答案 1 :(得分:0)

在51degrees.config中有一个设置

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

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