当我使用自定义缓存(VarByCustom)时,有没有办法拥有多个缓存页面?
对于一个实例,如果我实现一个缓存自定义变量浏览器虎钳,我将在全局实现函数,如下所示
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == Request.Browser.Version)
{
return Request.Browser.Version;
}
else
{
return base.GetVaryByCustomString(context, custom);
}
}
内部控制器
[PartialCaching(500000)]
public partial class WebUserControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
this.CachePolicy.Duration = new TimeSpan(0,5,0);
this.CachePolicy.Cached = true;
this.CachePolicy.SetVaryByCustom(Request.Browser.Version);
lblDate.Text = DateTime.Now.ToShortDateString();
lblTime.Text = DateTime.Now.ToLongTimeString();
}
}
在这种情况下,我希望在以下场景中有多个缓存页面;
在Chrome浏览器上打开同一页面〜缓存页面将作为回复发送
再次在Firefox上打开相同页面〜由于Chrome的页面已缓存,这将标识为更改,它将再次为Firefox缓存,但在这种情况下,我希望在第一步中为Firefox缓存页面而不是再次缓存。
答案 0 :(得分:1)
第5点你不正确。
按照VarByCustom="Browser"
的工作方式,不同浏览器的同一页面有单独的缓存版本。这意味着,首次为Chrome缓存页面时,它不会破坏Firefox或任何其他浏览器的缓存版本(如果存在)。
因此,当用户向Chrome发出请求时,会为Chrome浏览器创建单独的缓存副本(仅当它已经不存在时),并且Firefox的缓存版本仍然存在。
在下一刻,请求来自Firefox,Firefox浏览器的缓存版本作为响应发送。
注意:: 默认情况下使用VarByCustom="Browser"
,也会考虑您正在使用的浏览器的主要版本。
答案 1 :(得分:0)
这是我找到的解决方案
在控制器中,通过分隔,将控制器名称与浏览器合并;
[PartialCaching(1000)]
public partial class WebUserControl : System.Web.UI.UserControl
{
protected override void OnInit(EventArgs e)
{
this.CachePolicy.Duration = new TimeSpan(0,5,0);
this.CachePolicy.Cached = true;
this.CachePolicy.SetVaryByCustom("browser"+";"+this.ID);
}
protected void Page_Load(object sender, EventArgs e)
{
lblDate.Text = DateTime.Now.ToShortDateString();
lblTime.Text = DateTime.Now.ToLongTimeString();
}
}
在全局文件中,用户控件名称和浏览器字符串被拆分
public override string GetVaryByCustomString(HttpContext context, string custom)
{
string[] array = custom.Split(';');
string controllerName = array[1];
if (array[0] == "browser")
{
return HttpContext.Current.Request.UserLanguages[0]+controllerName;
}
else
{
return base.GetVaryByCustomString(context, custom);
}
}