求助:关于页面输出缓存的问题 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 --------------------编程问答--------------------
我想做页面的输出缓存 cache是个全局性的变量把 如果想针对每个访问的人都做对应的切换 cache 怎么用啊
不知道你是怎么用的 解释具体点呗 --------------------编程问答-------------------- 我再自己顶 --------------------编程问答-------------------- 快来人啊~~~ --------------------编程问答-------------------- 你的问题和页面输出缓存毫无关系。缓存都是整个appliction用的,根本不可能一个页面用。你老老实实用Session比较好。 --------------------编程问答--------------------
<%@ OutputCache Duration="43200" VaryByCustom="CityNumberKey" %>
我说的输出缓存时这个东西 页面怎么就不能缓存了? 用session达不到我想要的效果 无法做版本切换的缓存啊 你和我说的不是一个东西... --------------------编程问答-------------------- 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 但是这是就不好使咧啊 --------------------编程问答--------------------
知道你的意思的,你要把某个用户在A城市浏览的a页面缓存下来,然后必要时再转回来。所以你是针对不同Session在做的。这显然不适合使用页面输出缓存。不然你必须建张表进行管理,其次就是服务器开销会非常大。最好的做法对某些公共的不大会经常更新的内容进行缓存。 --------------------编程问答-------------------- 页缓存 是无法调用session 如果再不行我就试试把整个页面来控件化 在控件里就可以以用session来缓存了 缓存的目的其实就是为了减少直接对数据库的访问 无论怎么缓存其实都会减少系统开销的
更新缓存应该和正常的访问一个页差不多的开销把 --------------------编程问答-------------------- 再提供给LZ一个思路,如果页面缓存困难,那么就让SQLServer来缓存。一般B/S就只有一个访问数据库的用户,你可以建一个列表,10个用户。然后记得当一个Session来访问时,从表中取出空闲或最旧的链接字符串.那样就可以使用ADO.NET的缓存机制了。
补充:.NET技术 , ASP.NET