asp.net 根据Cookie变化控制缓存
2011-11-18 10:39 chris-shao 阅读(317) 评论(0) 编辑 收藏 举报遇到一个实际应用:做的网站静态内容居多,但是多语言支持,网站的开发已经结束,是将语言存入客户端cookie中,然后通过cookie值获取对应资源文件。
现在需要对网站增加缓存。在asp.net 框架下,当然是首选 OutputCache。OutputCache是将客户端缓存以及服务端缓存进行统一管理,通过不同的策略设置。由于语言的更换不会修改URL,所以是无法使用浏览器缓存了(这里想起google以及很多网站在做多语言时都会把语言放入到URL中的好处了,可以充分利用浏览器缓存)。
网上查了些资料,比较零碎,这里进行一个整理。
首先:在web.config中定义缓存策略,
在web.config中的system.web下增加如下:
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="pageCache" enabled="true" duration="600" varyByParam="none" varyByCustom="LANG" location="Server" />
<add name="productCache" enabled="true" duration="600" varyByParam="*" varyByCustom="LANG" location="Server" />
</outputCacheProfiles>
</outputCacheSettings>
<outputCache enableOutputCache="true"/>
</caching>
这里定义了两条策略,一条是不会根据参数更新缓存, 因为所有页面不需要传递参数,然后使用 varyByCustom="LANG" 自定义缓存失效,location设置缓存存储位置,这里仅选择Server.另外一条,需要根据传递的参数更新缓存,所以设置 varyByParam="*"。<outputCacheSettings>
<outputCacheProfiles>
<add name="pageCache" enabled="true" duration="600" varyByParam="none" varyByCustom="LANG" location="Server" />
<add name="productCache" enabled="true" duration="600" varyByParam="*" varyByCustom="LANG" location="Server" />
</outputCacheProfiles>
</outputCacheSettings>
<outputCache enableOutputCache="true"/>
</caching>
然后关键的一步实现自定义缓存失效:需要在 Global.asax 中重写GetVaryByCustomString
public override string GetVaryByCustomString(HttpContext context, string custom)
{
return "LANG=" + context.Request.Cookies["PureWirelessEnt.Language"]["OverrideLanguage"].ToString();
}
这里的custom就是 varyByCustom 值,框架会调用此方法判断是否有更新。如果定义了多个 varyByCustom的话,这里代码可以使用{
return "LANG=" + context.Request.Cookies["PureWirelessEnt.Language"]["OverrideLanguage"].ToString();
}
switch(custom)
{
case "Lang"
...
}
分别管理缓存更新策略。我这里是获取cookie中的语言,如果语言改变时cookie改变,返回值也就改变,就会更新缓存。
使用缓存策略,在aspx文件头部加入:
<%@ OutputCache CacheProfile="pageCache"%>
即可。 方法很简单,但是很实用,另外,我判断是否缓存起效的方法是,启用调试,然后在页面的page_load中设置断点,然后浏览器中刷新页面,如果能获取断点,说明缓存失效,如果无法获取断点,说明浏览器为缓存中的内容。
本文技术含量不高,圈子里有位朋友自定义实现通过文件的方式进行缓存, 如有未说到之处,或者更好的解决方案,欢迎指正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库