我原来写的利用UrlRewrite,asp.net动态生成htm页面(补充说明2) ,生成静态页面时,使用下边的代码
![](/Images/OutliningIndicators/ContractedBlock.gif)
Code
using System;
using System.IO;
using System.Web.UI;
using System.Web;
using URLRewriter.Config;
using System.Configuration;
using System.Text.RegularExpressions;
![](/Images/OutliningIndicators/None.gif)
namespace URLRewriter
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 生成htm静态页面
/// </summary>
public class ResponseFilter : Stream
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private Stream m_sink;
private long m_position;
private FileStream fs;
![](/Images/OutliningIndicators/InBlock.gif)
public ResponseFilter(Stream sink, string filePath)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_sink = sink;
fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
}
![](/Images/OutliningIndicators/InBlock.gif)
// The following members of Stream must be overriden.
public override bool CanRead
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ get
{ return true; } }
![](/Images/OutliningIndicators/InBlock.gif)
public override bool CanSeek
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ get
{ return false; } }
![](/Images/OutliningIndicators/InBlock.gif)
public override bool CanWrite
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ get
{ return false; } }
![](/Images/OutliningIndicators/InBlock.gif)
public override long Length
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ get
{ return 0; } }
![](/Images/OutliningIndicators/InBlock.gif)
public override long Position
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return m_position; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ m_position = value; }
}
![](/Images/OutliningIndicators/InBlock.gif)
public override long Seek(long offset, System.IO.SeekOrigin direction)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return 0;
}
![](/Images/OutliningIndicators/InBlock.gif)
public override void SetLength(long length)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_sink.SetLength(length);
}
![](/Images/OutliningIndicators/InBlock.gif)
public override void Close()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_sink.Close();
fs.Close();
}
![](/Images/OutliningIndicators/InBlock.gif)
public override void Flush()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_sink.Flush();
}
![](/Images/OutliningIndicators/InBlock.gif)
public override int Read(byte[] buffer, int offset, int count)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return m_sink.Read(buffer, offset, count);
}
![](/Images/OutliningIndicators/InBlock.gif)
// Override the Write method to filter Response to a file.
public override void Write(byte[] buffer, int offset, int count)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//Write out the response to the browser.
m_sink.Write(buffer, 0, count);
![](/Images/OutliningIndicators/InBlock.gif)
//Write out the response to the file.
fs.Write(buffer, 0, count);
}
}
}
![](/Images/OutliningIndicators/None.gif)
上边的这个类在生成静态页的时候,如果.net解析代码时,遇到错误,它依然会生成一个静态页面,而且这个静态页面在程序运行结束的时候,还处于打开状态。
显然这是我们不愿意看到的,而且这个类还不支持并发操作,如果和某一页面的关联的静态页失效了,假定这时候有两个用户同时访问这个页面,其中一个用户正在向静态页面写入数据,另外一个用户却需要访问这个已被别人打开的页面,系统同样会出现错误。基于这两个问题,我把这个类修改成下边的样子,就可以解决上述问题了。
![](/Images/OutliningIndicators/ContractedBlock.gif)
Code
using System;
using System.IO;
using System.Web.UI;
using System.Web;
using URLRewriter.Config;
using System.Configuration;
using System.Text.RegularExpressions;
![](/Images/OutliningIndicators/None.gif)
namespace URLRewriter
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//**/
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 生成htm静态页面
/// </summary>
public class ResponseFilter : Stream
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private Stream m_sink;
private long m_position;
private FileStream fs;
private string filePath = string.Empty;
![](/Images/OutliningIndicators/InBlock.gif)
public ResponseFilter(Stream sink, string filePath)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.m_sink = sink;
this.filePath = filePath;
}
![](/Images/OutliningIndicators/InBlock.gif)
// The following members of Stream must be overriden.
public override bool CanRead
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ get
{ return true; } }
![](/Images/OutliningIndicators/InBlock.gif)
public override bool CanSeek
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ get
{ return false; } }
![](/Images/OutliningIndicators/InBlock.gif)
public override bool CanWrite
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ get
{ return false; } }
![](/Images/OutliningIndicators/InBlock.gif)
public override long Length
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ get
{ return 0; } }
![](/Images/OutliningIndicators/InBlock.gif)
public override long Position
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return m_position; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ m_position = value; }
}
![](/Images/OutliningIndicators/InBlock.gif)
public override long Seek(long offset, System.IO.SeekOrigin direction)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return 0;
}
![](/Images/OutliningIndicators/InBlock.gif)
public override void SetLength(long length)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.m_sink.SetLength(length);
}
![](/Images/OutliningIndicators/InBlock.gif)
public override void Close()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.m_sink.Close();
this.fs.Close();
}
![](/Images/OutliningIndicators/InBlock.gif)
public override void Flush()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.m_sink.Flush();
}
![](/Images/OutliningIndicators/InBlock.gif)
public override int Read(byte[] buffer, int offset, int count)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return m_sink.Read(buffer, offset, count);
}
![](/Images/OutliningIndicators/InBlock.gif)
// Override the Write method to filter Response to a file.
public override void Write(byte[] buffer, int offset, int count)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//首先判断有没有系统错误
if (HttpContext.Current.Error == null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (fs == null)
this.fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
//将数据写入静态文件.
this.fs.Write(buffer, 0, count);
}
catch
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (fs != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//关闭流
this.fs.Close();
//删除静态页面
if (File.Exists(filePath))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
File.Delete(filePath);
return;
}
}
}
}
//Write out the response to the browser.
this.m_sink.Write(buffer, 0, count);
}
}
}
![](/Images/OutliningIndicators/None.gif)
修改的地方是构造函数和这个方法(
public override void Write(byte[] buffer, int offset, int count)),调用的方法分为两种,一种是在页面级别的调用,示例如下:
protected override void OnInit(EventArgs e)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if (!this.IsPostBack)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string filePath = this.Server.MapPath(Common.AppName) + "\\index.htm";
Response.Filter = new AspNetFilter(Response.Filter, filePath);
}
base.OnInit(e);
}
重写Page类的OnInit方法,另外一种调用方法参考我写的利用UrlRewrite,asp.net动态生成htm页面(补充说明2,