如果在CMS中使用生成HTML内容页, 那么有个这样的问题,   如何使客户端不缓存上次的页面?   例如数据库更新后重新生成了HTML页面(页面名字没有发生改变),  而此前用户已经访问过这个页面, 如何使用户再次访问时得到的页面是最新的,   请教大家, 谢谢!
  
  另外, 请大虾讲一下CSDN里生成静态帖子的大概原理(最好有缓存的讲解)  分不够再加

解决方案 »

  1.   


         我们常用的做法是发送一个“no-cache”的指令,但是实际使用过程中我们发现,这个指令对IE是有效的,但是对Firefox却没有效,这是因为,使用该指令Firefox不缓存HTTPS pages 但是还是会缓存HTTP pages ,这是Firefox的一个BUG,解决的办法很简单,就是使用no-store代替no-cache,同时发送no-store和no-cache指令     ASP.net中的处理方法,在不需要缓存的页面中添加如下代码     Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
         Response.Cache.SetNoStore();
    我也是今天看到的  另外, 请大虾讲一下CSDN里生成静态帖子的大概原理(最好有缓存的讲解) 其实会编写html以及会用string的replace方法就不成问题了,无非是自己先做一个模版一样的东西,自己在模版当中放一些奇怪的字符,可以叫做唯一字符,到时候传内容的时候替换掉即可
      

  2.   

    1.你是指服务器端不缓存呢,还是客户端不缓存?
    2.csdn应该没有真正静态化吧(估计,如果静态的化太吓人了,这么多内容,又要动态查询),只是url看起来像静态页面,称为“伪静态”,百度搜吧。
      

  3.   


    我觉得你可以做一个测试,看看客户端默认地是否在html更新时还缓存。除非浏览器做了特别的手动设置,实际上下载页面都会同时读取页面的最后修改时间爱你,所以一般来说,当你重新生成html的时候,浏览器一定会显示最新的html。
      

  4.   

    csdn 好像是xml+xsl做的哦.cc318.com 一个程序员的窝
      

  5.   


    完全可以测试下,当你更改了服务器端的HTML页面,客户端访问时是当然时访问最新的!
    楼主的意思时这样吧:如果数据库更新了数据,客户端访问时能够自动的从数据库获得数据并重新生成HTML页,然后返回给客户端最新生成的页面?
      

  6.   

    我们简单来看一下当前这个页面(在我现在看到的url是http://topic.csdn.net/u/20090301/16/115599c0-30d6-481e-bba1-41110079b897.html)的调试信息吧:浏览器向csdn的服务器请求:GET /u/20090301/16/115599c0-30d6-481e-bba1-41110079b897.html HTTP/1.1
    Accept: */*
    Referer: http://forum.csdn.net/SList/ASPDotNET
    Accept-Language: zh-cn
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.5.30729; .NET CLR 3.0.30618)
    Connection: Keep-Alive
    Host: topic.csdn.net
    Pragma: no-cache
    Cookie: __utma=260387464.378890235.1231344363.1235468182.1235904926.28; __utmz=260387464.1235904928.28.32.utmccn=(organic)|utmcsr=google|utmctr=.net+%E5%B0%86console%E8%BE%93%E5%87%BA%E8%BD%AC%E5%90%91|utmcmd=organic; WEA_u=39012013401117436; WEA_lu=http%3A//topic.csdn.net/u/20090301/16/115599c0-30d6-481e-bba1-41110079b897.html; WEA_lo=1235907657; WEA_savedata=pt:2897,rc:9,st:29773,lt:1235907657,ft:1232430011,ld:20090301; ASPSESSIONIDCSCTSBAB=EDDBHOGAGBLPJKCGNDGPPFHO; ASPSESSIONIDAQBRQDAA=GMGFEENAJDBMCNHMLLEOAIPL; cnt_uid_www=b133a20d8606c650de56a70dec0cb5e5; LastVisitedForum=3036657c-277c-476c-982d-75f154e09050*3931c03e-b66c-4189-a4f0-210fd9501803*8eb1f668-0e00-4a08-bf30-93ef948f04ee*4818cd61-5ea6-4167-8cbf-4ecf21faed1e*3036657c-277c-476c-982d-75f154e09050; __utma=17226283.578930363.1231234568.1235896239.1235905888.211; __utmz=17226283.1235905888.211.221.utmccn=(referral)|utmcsr=forum.csdn.net|utmcct=/BList/SE|utmcmd=referral; userid=982381; __gads=ID=8b1416bcd4ead61f:T=1232033761:S=ALNI_MZd3duCriIYrxo8qGsxWvCgZDy6UQ; IMMsgID_18d489181d25f2e38c7e943db24595e6=150; IMMsgID_d41d8cd98f00b204e9800998ecf8427e=148; ystat_bc_923704=3799466245416206467; ystat_bc_30117=10744635221343160798; ystat_bc_904243=1400145469210433129; _user_sid=5f103ca2547f7af6b8f11f36fe037f6f; __utmb=17226283; ABCDEF=igqhM95bqpbD2L%252fTl7u%252bFaia739kIfXDOTZXxl0J2hAiaqlV63OXCwy1038Ur93IjJ6gAsnjgPHeuB2nYOLKye4NVAYC3mWlu%252fcueKaayP6IGhSBZq3Rsa8YtLtSV86ZS2d8z7q35%252btCZbd%252fKEqWSnKZRZSEPNkuKsv7mi07OAXZa%252fj4hXDQUVGPWh%252fbF9yjlILrMWK%252fDDJ%252fudZ8tsAaNMhSBigPs2SceceCgXP47%252fgyLvcMFmC7WHgU0179FITB; QWERTOP=6321; UserName=sp1234; activeUserName=sp1234; PName=3e28f0690a397c03b2072958762113b80fb91e38592837212e9f8d; __utmc=17226283
    得到的应答是:HTTP/1.0 200 OK
    Date: Sun, 01 Mar 2009 11:40:47 GMT
    Server: Microsoft-IIS/6.0
    X-Powered-By: ASP.NET
    Last-Modified: 2009-03-01 19:39:50
    Content-Length: 71703
    Content-Type: text/html
    Expires: Sun, 01 Mar 2009 11:43:47 GMT
    Cache-Control: Public
    Age: 78
    X-Cache: HIT from longrujun.name
    X-Cache-Lookup: HIT from longrujun.name:80
    Via: 1.0 cache1.longrujun.name:80 (longrujun)
    Connection: close<!-- DefaultTemplate --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
    <head>
    <meta name="designer" content="csdn design team" />
    <meta content="all" name="robots" />
    <meta http-equiv="Content-Language" content="zh-CN" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" type="text/css" href="/u/ui/styles/default/topic.css" /><link type="text/css" rel="Stylesheet" href="/u/ui/styles/mzform.css" />
    <title>有关CMS的问题,向大家请教</title>
    <meta csdnid="keywords" content="" name="Keywords" />
    <meta id="topicViewUrl" csdnid="topicViewUrl" content="http://topic.csdn.net/u/20090301/16/115599c0-30d6-481e-bba1-41110079b897.html"  />
    <meta csdnid="sectionId" content="3036657c-277c-476c-982d-75f154e09050" />
    <meta  csdnid="description" content="有关CMS的问题,向大家请教" name="description" />
    <script type="text/javascript" src="/u/ui/scripts/StaticTopicView.js"></script>
    </head>
    <body>
     <a name="top"></a>
     <div id="CSDNPHL">
      <table class="CSDN-PHF" border="0" cellspacing="1" cellpadding="0"><tr>
          <td><a rel="mz" href="http://www.csdn.net/">首页</a></td>
          <td><a rel="mz" href="http://news.csdn.net/">新闻</a></td>
          <td><a rel="mz" href="http://bbs.csdn.net/">论坛</a></td>
          <td><a rel="mz" href='http://groups.csdn.net/'>群组</a></td>
          <td><a rel="mz" href="http://blog.csdn.net/">Blog</a></td>
          <td><a rel="mz" href="http://dev.csdn.net/">文档</a></td>
          <td><a rel="mz" href="http://download.csdn.net/">下载</a></td>
          <td><a rel="mz" href="http://book.csdn.net/">读书</a></td>
          <td><a rel="mz" href="http://tag.csdn.net/">Tag</a></td>
    .........
    csdn现在是在服务器端得到html文本并返回给客户端的。
      

  7.   

    我并不知道csdn生成html的具体做法。不过我宁愿相信csdn是真的生成了html文件,而不是虚假的html。我们可以假想一下这样的实现方式:首先,创建网站 topic.csdn.net,这个网站丝毫不需要asp.net等系统,而仅仅访问最简单的html。这样的网站根本不依赖于asp.net系统,就算asp.net系统垮掉了也不受影响。同时,既然是简单html文件,那么我们基本上无需考虑在服务器端做缓存。其次,回到CMS系统自身。我们可以写一个小过程:private void 保存网页到文件(string page, string file)
    {
        var sb = new StringBuilder();
        var sw = new StringWriter(sb);
        Server.Execute(page, sw);
        File.WriteAllText(file, sb.ToString());
    }然后,我们可以写一个专门显示贴子的aspx,例如是这样访问:“~/CMS/ShowContent.aspx?id=帖子id编号”。再然后,在我们的CMS系统中再设计一个aspx,例如是这样访问:“~/CMS/Reply.aspx?id=帖子id编号”。这个reply.aspx是签入ShowContent.aspx中的一个IFrame中的,就像当前这个帖子页面一样,在底部有一个Reply.aspx页面。把上面联系起来,我们可以在Reply.aspx中把提交内容保存到数据库之后立刻调用方法“保存网页到文件”把ShowContext.aspx输出的结果当时就保存成topic.csdn.net网站目录下的html文件。同时我们的“发贴”页面也可以在把数据保存到数据库之后立刻调用这个方法生成这个html。最后,在修改一下论坛帖子列表页面,当生成列表是链接不要绑定为ShowContent.aspx页面,而是生成为上面生成html文件的地址。
    基本上这样一个原型就可以了。实际上,看看“保存网页到文件”方法,是不是特别简单。你会适当的时机调用它,就能制作这类功能了。
    当然,其实我并不主张静态html页面。在2000年网络泡沫特别巨大的时候,涌现出来的许多以那个时代的网页编程技术开发的网站非常时兴转换为html的方式。这种方式的好处就是发布这些静态页面很简单,当你的服务器很差劲、系统维护总是不及时、网站无需大量的实时服务功能时,静态页面网站显得比动态页面网站更稳定得多。
      

  8.   

    这个reply.aspx是签入ShowContent.aspx中的一个IFrame中的  -->  这个reply.aspx是嵌入ShowContent.aspx中的一个IFrame中的你可以测试:把方法“保存网页到文件”放入一个aspx,然后在这个页面上放上两个TextBox让客户端输入网站内的页面路径(可以以~开头)以及磁盘文件路径,然后按一个按钮就执行这个方法来把本网站上任意页面“生成HTML内容页”了。