6

我在我的 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.IsMobileDevicefalse.

不确定是什么导致桌面站点为移动站点缓存 - 可能是MVC 4 中的错误的遗留问题。它似乎是随机的(即,有一天它会很好,然后另一天它会出于某种原因为桌面站点提供服务)并且回收应用程序池将始终修复它。

我还发现我可以使用以下方法获取覆盖的浏览器:

using System.Web.Wepages;

context.Request.RequestContext.HttpContext.GetOverriddenBrowser();

但是好像用处不大

4

2 回答 2

0

在 51degrees.config 中有一个设置

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

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

于 2017-04-06T10:50:51.053 回答
0

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

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

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

(持续时间由你决定)

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

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

我希望这会有所帮助。

于 2016-10-13T18:39:35.983 回答