在做一个多语言的web项目,目前有这样一个bug:
1. 设置你的语言为中文, (这个语言不是OS或者浏览器的语言,就是网页上一个下了列表框,后台根据这个设定线程的文化信息)
2. 访问A页面
3. 访问B页面
4. 更改语言为英语
5. 这时B页面因为有postback,所以显示英语
6. 再访问A页面,因为缓存的原因,这是A页面还是中文。 -- 这就是个bug
这个bug只存在IE上(我试了IE8),在firefox上没有。 我尝试在B页面postback的时候清除cache(如下), 但是没有成功。foreach(DictionaryEnty de in Httpcontext.current.cache)
   Httpcontext.current.cache.remove(de.ToString());
高手给点建议吧? 整个网站的cache机制还是要的,不能完全禁止它。

解决方案 »

  1.   

    单独设置页面cache策略。下面演示一下在Asp.net里面具体的写法:1.       页面/控件cache可以申明在aspx,ascx文件里面,也可以在code behind里面作出申明。<%@ OutputCache Duration="#ofseconds"   Location="Any Client Downstream Server None     ServerAndClient "   Shared="True False"   VaryByControl="controlname"   VaryByCustom="browser customstring"   VaryByHeader="headers"   VaryByParam="parametername"   CacheProfile="cache profile name ''"   NoStore="true false"   SqlDependency="database/table name pair CommandNotification"%>主要的参数是:Duration: cache有效的时间,单位秒Shared:只对控件有效,在控件可以同时应用与多个页面的时候,多个页面是否可以共享这一个cache而不用每个页面维护自己对这个控件的cache。VaryByControl:cache随控件的ID变化VaryByCustom:cache随用户自定义的一个变量来变化,该变量是在这里指定,然后应该在Global.ascx里面实现:public override string GetVaryByCustomString (HttpContext context,string custom)该声明的custom参数就是在OutPutcache里面申明的变量。通过在这个函数里面对不同的custom参数返回不同的字符串值来表示不同的cache内容。VaryByHeader, VaryByParam,CacheProfile也是设置不同的cache版本的。NoStore表示不允许把cache的内容写到内存以外其它的存储设备上,这是对安全性比较高的内容的需要。SqlDependency是和数据库相关的。
      

  2.   

    单独设置页面怎么可以呢? 我这次是访问的A,下次是B,再是C,然后改变了语言,再访问原来的页面,还是有缓存。有没有什么办法可以清除整个网站在IE中的缓存,这样无论哪个网页都没有缓存了,只能从服务器上去取。
      

  3.   

    默认都有客户端缓存,你要给他禁止掉,在每个页面的init过程里
    protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            Response.ContentEncoding = Encoding.UTF8;
            Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetValidUntilExpires(false);
    }
      

  4.   

    楼上兄弟的方法会不会导致整个网站都不能cache? 我还是希望有cache的,但是希望改变语言后,不从cache里面取,而是从服务器更新。 这个才是难点呢
      

  5.   


    你写在哪个页面上,哪个页面才不cache,不会整站都不cache的