asp.net 通過請求生成靜態頁面(非替換)

Posted on 2006-08-09 18:04  零度海洋  阅读(273)  评论(0)    收藏  举报
<!--main.aspx-->
    <%@ page language="c#" %>
    <%@ import namespace=system.io %>
    <script runat="server">
    protected override void oninit (eventargs e)
    {
    int id;
    try
    {
    id = int.parse (request.querystring["id"]);
    }
    catch
    {
    throw (new exception ("页面没有指定id"));
    }
    
    string filename=server.mappath("statichtml_"+id+".html");
    
  //尝试读取已有文件
    stream s = getfilestream (filename);
    if (s != null)//如果文件存在并且读取成功
    {
    using (s)
    {
    stream2stream (s, response.outputstream);
    response.end ();
    }
    }
    
    
    //调用main_execute,并且获取其输出
    stringwriter sw = new stringwriter ();
    server.execute ("main_execute.aspx", sw);
    
    string content = sw.tostring ();
    
  //输出到客户端
    response.write(content);
    response.flush();
    
    //写进文件
    
    try
    {
    using (filestream fs = new filestream (filename, filemode.create, fileaccess.write, fileshare.write))
    {
    using (streamwriter streamwriter = new streamwriter (fs, response.contentencoding))
    {
    streamwriter.write (content);
    }
    }
    }
    finally
    {
    //response.end ();
    }
    }
    static public void stream2stream (stream src, stream dst)
    {
    byte[] buf = new byte[4096];
    while (true)
    {
    int c = src.read (buf, 0, buf.length);
    if(c==0)
    return;
    dst.write (buf, 0, c);
    }
    }
    public stream getfilestream(string filename)
    {
    try
    {
    datetime dt = file.getlastwritetime (filename);
    timespan ts=dt - datetime.now;
    if(ts.totalhours>1)
    return null;    //1小时后过期
    return new filestream (filename, filemode.open, fileaccess.read, fileshare.read);
    }
    catch
    {
    return null;
    }
    }
    </script>
    
    
    <!--main_execute.aspx-->
    <%@ page language="c#" %>
    <html>
    <head runat="server">
    <title>untitled page</title>
    </head>
    <body>
    
    id:
    <%=request.querystring["id"]%>
    
    </body>
    </html>
    
    
    
    其中原理是这样的.
    main_execute.aspx是生成html的页面.
    
    现在用main.aspx来对它进行缓存.
    过程如下:
    
    首先根据页面参数算出文件名.(这个例子只根据request.querystring["id"]来算)
    尝试读取缓存的文件.如果成功,那么response.end();
    如果不成功:
    使用server.execute来调用main_execute.aspx,并且获取它的结果内容.
    得到内容后,立刻输出到客户端.
    最后把内容写进文件里,提供给下一次做为缓存度取.

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3