<!--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.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,并且获取它的结果内容。
得到内容后,立刻输出到客户端。
最后把内容写进文件里,提供给下一次做为缓存度取。
新闻热点
疑难解答
图片精选