我原来写的利用UrlRewrite,asp.net动态生成htm页面(补充说明2) ,生成静态页面时,使用下边的代码

Code
using System;
using System.IO;
using System.Web.UI;
using System.Web;
using URLRewriter.Config;
using System.Configuration;
using System.Text.RegularExpressions;

namespace URLRewriter
{
    /**//// <summary>
    /// 生成htm静态页面
    /// </summary>
    public class ResponseFilter : Stream
    {
        private Stream m_sink;
        private long m_position;
        private FileStream fs;

        public ResponseFilter(Stream sink, string filePath)
        {
            m_sink = sink;
            fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
        }

        // The following members of Stream must be overriden.
        public override bool CanRead
        { get { return true; } }

        public override bool CanSeek
        { get { return false; } }

        public override bool CanWrite
        { get { return false; } }

        public override long Length
        { get { return 0; } }

        public override long Position
        {
            get { return m_position; }
            set { m_position = value; }
        }

        public override long Seek(long offset, System.IO.SeekOrigin direction)
        {
            return 0;
        }

        public override void SetLength(long length)
        {
            m_sink.SetLength(length);
        }

        public override void Close()
        {
            m_sink.Close();
            fs.Close();
        }

        public override void Flush()
        {
            m_sink.Flush();
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return m_sink.Read(buffer, offset, count);
        }

        // Override the Write method to filter Response to a file.
        public override void Write(byte[] buffer, int offset, int count)
        {
            //Write out the response to the browser.
            m_sink.Write(buffer, 0, count);

            //Write out the response to the file.
            fs.Write(buffer, 0, count);
        }
    }
}

上边的这个类在生成静态页的时候,如果.net解析代码时,遇到错误,它依然会生成一个静态页面,而且这个静态页面在程序运行结束的时候,还处于打开状态。
显然这是我们不愿意看到的,而且这个类还不支持并发操作,如果和某一页面的关联的静态页失效了,假定这时候有两个用户同时访问这个页面,其中一个用户正在向静态页面写入数据,另外一个用户却需要访问这个已被别人打开的页面,系统同样会出现错误。基于这两个问题,我把这个类修改成下边的样子,就可以解决上述问题了。

Code
using System;
using System.IO;
using System.Web.UI;
using System.Web;
using URLRewriter.Config;
using System.Configuration;
using System.Text.RegularExpressions;

namespace URLRewriter
{
    /**//**/
    /**//// <summary>
    /// 生成htm静态页面
    /// </summary>
    public class ResponseFilter : Stream
    {
        private Stream m_sink;
        private long m_position;
        private FileStream fs;
        private string filePath = string.Empty;

        public ResponseFilter(Stream sink, string filePath)
        {
            this.m_sink = sink;
            this.filePath = filePath;
        }

        // The following members of Stream must be overriden.
        public override bool CanRead
        { get { return true; } }

        public override bool CanSeek
        { get { return false; } }

        public override bool CanWrite
        { get { return false; } }

        public override long Length
        { get { return 0; } }

        public override long Position
        {
            get { return m_position; }
            set { m_position = value; }
        }

        public override long Seek(long offset, System.IO.SeekOrigin direction)
        {
            return 0;
        }

        public override void SetLength(long length)
        {
            this.m_sink.SetLength(length);
        }

        public override void Close()
        {
            this.m_sink.Close();
            this.fs.Close();
        }

        public override void Flush()
        {
            this.m_sink.Flush();
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return m_sink.Read(buffer, offset, count);
        }

        // Override the Write method to filter Response to a file.
        public override void Write(byte[] buffer, int offset, int count)
        {
            //首先判断有没有系统错误
            if (HttpContext.Current.Error == null)
            {
                try
                {
                    if (fs == null)
                        this.fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
                    //将数据写入静态文件.
                    this.fs.Write(buffer, 0, count);
                }
                catch
                {
                    if (fs != null)
                    {
                        //关闭流
                        this.fs.Close();
                        //删除静态页面
                        if (File.Exists(filePath))
                        {
                            File.Delete(filePath);
                            return;
                        }
                    }
                }
            }
            //Write out the response to the browser.
            this.m_sink.Write(buffer, 0, count);
        }
    }
}

修改的地方是构造函数和这个方法(public override void Write(byte[] buffer, int offset, int count)),调用的方法分为两种,一种是在页面级别的调用,示例如下:

    protected override void OnInit(EventArgs e)
    {
        if (!this.IsPostBack)
        {
            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,

转载于:https://www.cnblogs.com/fengfeng/archive/2008/02/19/1072505.html

用Response.Filter生成静态页相关推荐

  1. Asp.net 2.0 中将网站首页生成静态页的一个比较好的方法

    做网站时,有时为了提高性能会将网站首页生成静态页(当然, Asp.net中页面缓存也是一个不错的选择了 将页面生成静态的方法有多中,据不完全统计有N种(N>1) 呵呵 以下的方法来自 " ...

  2. 详谈asp生成静态页方法

    生成静态页的好处不用说,当今大型网站,为缓解服务器端的压力许的的页面都改用了静态的页面,并利用AJAX技术动态地更新其中的部分内容,如广告等. 一个简单的不用模板可以直接生成HTML静态页的方法. 如 ...

  3. ASP非模板生成静态页

    首先我们要创建一个数据库表news包括字段 id   title     contect     date  接着我们设置一个ASP数据显示页shownew.asp 代码如下: <%@codep ...

  4. 利用smarty生成静态页的关键代码

    smarty中有一个获取模板页内容方法fetch(), 它的声明原形是这样的: <?php function fetch( $resource_name, $cache_id=null, $co ...

  5. Smarty 生成静态页

    1.smarty配置文件:(直接继承smarty类) <?php require('/libs/Smarty.class.php'); class SmartyMistake extends S ...

  6. html手机pc不同页面,PC端和手机端如何同时生成静态页

    静态页是和图片类似的静态资源,访问静态资源不会经过程序处理,不会根据浏览器返回不同页面.要同时支持PC端和手机端浏览器,且要生成静态页时,最好使用bootstrap之类的技术,实现自适应页面设计. 如 ...

  7. mvc分页生成静态页,mvc生成静态页

    http://blog.csdn.net/xxj_jing/article/details/7899125 分页生成静态页 http://www.cnblogs.com/luanyilin/archi ...

  8. dedesmc 手机端生成静态页

    dedesmc 手机端生成静态页 1.首先下载插件,下载地址:https://pan.baidu.com/s/1Nfx_KBYuxRkZ7VzoPxy28g 密码:83x7 2.进入 dedecms ...

  9. 织梦列表页生成的html在哪里,织梦系统给手机版生成静态页HTML的方法

    原标题:织梦系统给手机版生成静态页HTML的方法 织梦dedecms默认的手机端不能生成静态,对于使用静态的网站来说多少有些不方便,其实dedecms可以通过一种另类的方法来给手机端生成静态页面的. ...

最新文章

  1. SharpStrike:基于C#实现的后渗透漏洞利用工具
  2. Attention的梳理、随想与尝试
  3. python中分支结构包括哪些_python中的分支结构
  4. 阿里、华为、美团,大厂面试算法题,这些你会吗?
  5. java后端怎么返回音频流_Java语言中的IO流read()方法返回值为什么是int而不是byte?...
  6. java绘制图形_java绘制基本图形.doc
  7. 基于matlab的车牌定位算法设计与实现,matlab车牌定位系统设计(源码+文档)
  8. 12个职场信条让你的工作不可替代
  9. (转)常用英语100句
  10. 阿里云mysql数据库日志_阿里云mysql数据库操作日志
  11. cadvisor 容器安装部署
  12. 厦门大学计算机考研复试线2021,【厦门大学】2021考研复试分数线3月13日已公布!速看!...
  13. mysql gbk转utf8_MySQL字符集GBK转换到UTF8
  14. android 平板z97,高清配置 翰智Z97-W通话版平板评测
  15. 硬盘安装Fedora 12
  16. win10 你没有足够的权限执行此操作。
  17. 初期投资60万7-11加盟模式在华将变通
  18. 为什么计算方差有时候除n,有时候除n-1
  19. 气体在线监测仪——排水管井内的有害气体监测
  20. 唐人笔+手写板连接到计算机usb端口+错误,汉王唐人笔TR-TP618+TR-TP216驱动

热门文章

  1. 品‮方牌‬可以利用视‮号频‬做什么
  2. 公司行政的未来在哪里?要不要转行?
  3. 合伙和合作的区别是什么?
  4. 在线索二叉树中找前驱后继
  5. 使用SQL Server ROWCOUNT
  6. azure 安全组_用户安全和Azure成本风险
  7. ssis 派生列_SSIS脚本组件与派生列
  8. 十步轻松搞定IIS+PHP环境搭建
  9. Win7下部署Lepus企业级MySQL数据库监控
  10. msp430项目编程46