如何拥有ASP.Net Webforms的多个缓存版本?

时间:2014-02-26 03:23:52

标签: asp.net caching

当我使用自定义缓存(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();
    }

}

在这种情况下,我希望在以下场景中有多个缓存页面;

  1. 在Firefox上打开页面〜页面被缓存并返回浏览器
  2. 在同一个Firefox浏览器上打开同一页面〜缓存页面作为响应发送
  3. 在Chrome上打开同一页面〜由于浏览器不同,页面会被缓存并返回浏览器。
  4. 在Chrome浏览器上打开同一页面〜缓存页面将作为回复发送

  5. 再次在Firefox上打开相同页面〜由于Chrome的页面已缓存,这将标识为更改,它将再次为Firefox缓存,但在这种情况下,我希望在第一步中为Firefox缓存页面而不是再次缓存。

2 个答案:

答案 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);
    }

}