我在我的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();
但它似乎没什么用处
答案 0 :(得分:0)
在我看来,如果您将缓存存储在客户端端,那么您正在做的事情应该有效。
您应该以下列方式在控制器操作上使用OutputCache属性:
[OutputCache(Duration = 5, VaryByCustom = "Mobile", Location = OutputCacheLocation.Client)]
(持续时间取决于你)
话虽如此,浏览器检测基于HTTP标头,因此如果请求的浏览器正在为其他代理发送标头,则没有任何帮助。
另一种选择是使用特征检测。
我希望有所帮助。
答案 1 :(得分:0)
在51degrees.config中有一个设置
<redirect devicesFile="" timeout="20" firstRequestOnly="true"
这首先要求可能会使您的缓存系统混淆,因此将第一个移动设备视为第一个请求,将所有其他移动设备视为原始移动设备的同一会话。尝试将此设置为false,看看是否有助于解决您的问题。