当前位置:编程学习 > C#/ASP.NET >>

求助:关于页面输出缓存的问题 GetVaryByCustomString

问题代码部分加黑了 那部分是为对应的cookie赋值 但是这部分赋值 在我这里怎么也赋值不上
带来的问题 就是通过cookie来切换版本缓存时 新的cookie赋值有问题 
在两个都是缓存页之间切换时 要先对cookie赋值 再切换成另一个页面

我不知道是不是 无法给cookie做赋值操作 还是别的什么原因 谁能帮帮我啊 如果不能有没有别的解决办法

我要实现的是 切换不同的城市 同一个页面对不同的城市缓存对应的版本
而同一个城市切换不同的栏目时在url的参数上有时是体现不出来的 一直是用session来保存城市的信息但是没有加页面缓存
现在想给页面加上缓存机制 session 在 GetVaryByCustomString 中无法做操作 改用cookie又出现了这问题
在网上寻找了半天 网上关于这方面的应用 都是在 GetVaryByCustomString 取得cookie值 这个是可以的
但是当都在缓存版本中进行切换时 就不知道在什么位置来给cookie 赋值了

也不知道我把问题说明白没....
public override string GetVaryByCustomString(HttpContext context, String arg)
        {
            string cachekey = String.Empty;
            switch (arg)
            {
                case "CityNumberKey":
                    string outstr = HttpContext.Current.Request.QueryString["site"];
                    string citynumber = String.Empty;
                    if (outstr != null && outstr != "")
                        citynumber = outstr;
                    else
                    {
                        string HostName = HttpContext.Current.Request.Url.Host.ToString().ToLower();        //获取URL主机地址
                        string[] SiteHost = HostName.Split('.');       //数组,以“.”分隔
                        
                        if (SiteHost.Length >= 3)    //有效的域名
                        {
                            string SiteDomainName = SiteHost[0].ToString();//取得数组最前面一组值,及二级域名主机头

                            if (SiteDomainName != null && SiteDomainName != "" && SiteDomainName != "www" && SiteDomainName != "localhost")
                                citynumber = SiteDomainName;
                            else
                            {
                                if (context.Request.Cookies[AppConfiguration.KEY_CustomString_CookieCityNumber] != null)
                                    citynumber = context.Request.Cookies[AppConfiguration.KEY_CustomString_CookieCityNumber].Value;
                            }
                        }
                        else
                        {
                            if (context.Request.Cookies[AppConfiguration.KEY_CustomString_CookieCityNumber] != null)
                                citynumber = context.Request.Cookies[AppConfiguration.KEY_CustomString_CookieCityNumber].Value;
                        }
                    }

                    DataRow []dr = AppSessionCacheCookie.GetCityInfo.Select(" number = " + citynumber);

                    if (dr != null && dr.Length > 0)
                        cachekey = HttpContext.Current.Request.Path + ":cityid=" + citynumber;
                    else
                    {
                        cachekey = HttpContext.Current.Request.Path + ":cityid=" + AppConfiguration.KEY_CONSTCITYNUMBER;
                        citynumber = AppConfiguration.KEY_CONSTCITYNUMBER;
                    }

                    if (context.Response.Cookies[AppConfiguration.KEY_CustomString_CookieCityNumber] == null)
                        context.Response.Cookies.Add(new HttpCookie(AppConfiguration.KEY_CustomString_CookieCityNumber, citynumber));
                    else
                    {
                        context.Response.Cookies[AppConfiguration.KEY_CustomString_CookieCityNumber].Value = citynumber;
                        context.Response.Cookies[AppConfiguration.KEY_CustomString_CookieCityNumber].Expires = DateTime.Now.AddYears(1);
                    }
                    return cachekey;
                    break;
            }
            return base.GetVaryByCustomString(context, arg);
        } --------------------编程问答-------------------- 自己顶啊........ --------------------编程问答-------------------- 比如你先将城市信息放在Cache里  比如Cache["成都"] = "";
这里只需要读cookie里的城市来对应获取Cache中的数据
如果切换城市先修改cookie --------------------编程问答--------------------
引用 2 楼 ttg520 的回复:
比如你先将城市信息放在Cache里  比如Cache["成都"] = "";
这里只需要读cookie里的城市来对应获取Cache中的数据
如果切换城市先修改cookie


我想做页面的输出缓存 cache是个全局性的变量把 如果想针对每个访问的人都做对应的切换 cache 怎么用啊
不知道你是怎么用的 解释具体点呗 --------------------编程问答-------------------- 我再自己顶 --------------------编程问答-------------------- 快来人啊~~~ --------------------编程问答-------------------- 你的问题和页面输出缓存毫无关系。缓存都是整个appliction用的,根本不可能一个页面用。你老老实实用Session比较好。 --------------------编程问答--------------------
引用 6 楼 caobob 的回复:
你的问题和页面输出缓存毫无关系。缓存都是整个appliction用的,根本不可能一个页面用。你老老实实用Session比较好。


<%@ OutputCache Duration="43200" VaryByCustom="CityNumberKey" %>
我说的输出缓存时这个东西  页面怎么就不能缓存了? 用session达不到我想要的效果 无法做版本切换的缓存啊 你和我说的不是一个东西... --------------------编程问答-------------------- OutputCache  确认可以缓存    你意思是依赖CityNumberKey去缓存   CityNumberKey修改了缓存也要更新 --------------------编程问答--------------------
引用 8 楼 ttg520 的回复:
OutputCache  确认可以缓存    你意思是依赖CityNumberKey去缓存  CityNumberKey修改了缓存也要更新

这个我知道啊 
public override string GetVaryByCustomString(HttpContext context, String arg) 
不就是就该缓存依赖的方法嘛~~
--------------------编程问答-------------------- 根据自定义字符串对页输出的多个版本进行缓存
在 ASP.NET 页中包括 @ OutputCache 指令,该指令带有必需的 OutputCacheParameters.Duration 和 VaryByParam 属性。必须将 Duration 属性设置为大于零的整数。如果不想使用 VaryByParam 属性提供的功能,则必须将其值设置为“无”。

若要以声明方式设置自定义字符串,请在 @ OutputCache 指令中包括 VaryByCustom 属性,并将该属性设置为您要作为进行不同输出缓存行为的依据的字符串。 

下面的指令根据自定义字符串“minorversion”改变页输出。

  复制代码 
<%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="minorversion" %>
 

若要以编程方式设置自定义字符串,请调用 SetVaryByCustom 方法,并将要使用的自定义字符串传递给它。 

下面的代码示例演示如何将自定义字符串设置为“minorversion”。

C#  复制代码 
Response.Cache.SetVaryByCustom("minorversion");
 

在应用程序的 Global.asax 文件中,重写 GetVaryByCustomString 方法以指定自定义字符串的输出缓存行为。 

被重写的方法接受您在 VaryByCustom 属性或 SetVaryByCustom 方法中设置的字符串,作为它的 arg 参数。例如,有些页可能根据请求浏览器的次版本进行缓存。对于这些页,可以将 VaryByCustom 属性设置为“minorversion”。然后,在被重写的 GetVaryByCustomString 方法中,可以检查 arg 参数,并根据 arg 参数的值是否为“minorversion”返回不同的字符串。

下面的代码示例演示一个 Global.asax 文件,其中的 GetVaryByCustomString 方法被重写。 

C#  复制代码 
<%@ Application language="C#" %>
<script runat="server">
public override string GetVaryByCustomString(HttpContext context, 
    string arg)
{
    if(arg == "minorversion")
    {
        return "Version=" +
            context.Request.Browser.MinorVersion.ToString();
    }
   else
   {
      return "";
    }
}
</script>
 详见MSDN
--------------------编程问答-------------------- <%@ OutputCache Duration="43200" VaryByCustom="CityNumberKey" SqlDependency="库名:表名" VaryByParam="none" %>

这是我的全部缓存设置方法 不缺少必须的属性

我用的就是VaryByCustom 的自定义字符串依赖
但是依赖完了 在已经缓存的页之间切换时 要读取和设置cookie的值
在这个方法里 我想设置cookie 但是这是就不好使咧啊 --------------------编程问答--------------------
引用 7 楼 xzd0313 的回复:
引用 6 楼 caobob 的回复:
 你的问题和页面输出缓存毫无关系。缓存都是整个appliction用的,根本不可能一个页面用。你老老实实用Session比较好。


  <%@ OutputCache Duration="43200" VaryByCustom="CityNumberKey" %>
 我说的输出缓存时这个东西  页面怎么就不能缓存了? 用session达不到我想要的效果 无法做版本切换的缓存啊 你和我说的不是一个东西...


知道你的意思的,你要把某个用户在A城市浏览的a页面缓存下来,然后必要时再转回来。所以你是针对不同Session在做的。这显然不适合使用页面输出缓存。不然你必须建张表进行管理,其次就是服务器开销会非常大。最好的做法对某些公共的不大会经常更新的内容进行缓存。 --------------------编程问答-------------------- 页缓存 是无法调用session 如果再不行我就试试把整个页面来控件化 在控件里就可以以用session来缓存了 缓存的目的其实就是为了减少直接对数据库的访问 无论怎么缓存其实都会减少系统开销的 
更新缓存应该和正常的访问一个页差不多的开销把 --------------------编程问答-------------------- 再提供给LZ一个思路,如果页面缓存困难,那么就让SQLServer来缓存。一般B/S就只有一个访问数据库的用户,你可以建一个列表,10个用户。然后记得当一个Session来访问时,从表中取出空闲或最旧的链接字符串.那样就可以使用ADO.NET的缓存机制了。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,