asp.net 使用HttpModule对全站输出的动态页面的HTML内容进行修改,不会错乱

比上一编《asp.net 使用页适配器和重写Render对全站输出的页面的HTML内容进行修改,不会错乱》更容易的方方

http://blog.csdn.net/lrxin/article/details/40861039

配置方法:

<httpModules>

<add name="FileEditModule" type="Framework.FileEditModule, Framework" />

</httpModules>

<pre name="code" class="csharp">public class FileEditModule : System.Web.IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication application)
        {
            application.EndRequest += new EventHandler(application_EndRequest);
        }

        void application_EndRequest(object sender, EventArgs e)
        {
            try
            {
                HttpApplication application = (HttpApplication)sender;

                Uri url = application.Request.Url;
                // 如果请求Url需要验证
                string[] ss = application.Request.FilePath.Split('.');
                string extension = ss[ss.Length - 1];
                extension = extension.ToLower();
                string[] extensions = new string[] {
                "ashx",
                "aspx",
                "asmx"
                };
                if (extensions.Contains(extension))
                {
                    string html = GetRenderHtml(null, application.Response);
                    //....对html进行操作
                    application.Response.ClearContent();
                    application.Response.Write(html);

                }
            }
            catch (Exception ex) { }
        }
public string GetRenderHtml(HtmlTextWriter writer, HttpResponse Response)
        {
            //var Response = this.Page.Response;

            //Response.Output其实就是一个HttpWriter,Response.OutputStream其实就是HttpResponseStream,Object.ReferenceEquals (Response.Output,(Response.OutputStream as HttpResponseStream)._writer)为true

            BindingFlags bind = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.GetField;
            //因为HttpWriter._charBuffer这个字符数组的长度是1024,
            //所以推测,一旦某一段字符串超过1024就会创建一个IHttpResponseElement,
            //然后加入到HttpWriter._buffers,HttpWriter._buffers的每一个元素都实现了IHttpResponseElement接口,
            //具体类型可能是HttpResponseUnmanagedBufferElement,HttpSubstBlockResponseElement等类型
            ArrayList arr = (ArrayList)Response.Output.GetType().GetField("_buffers", bind).GetValue(Response.Output);

            Assembly systemWeb = Assembly.Load("System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
            Type type = systemWeb.GetType("System.Web.IHttpResponseElement");
            MethodInfo method = type.GetMethod("GetBytes");
            StringBuilder sb = new StringBuilder(5000);
            //遍历每一个buffer,获取buffer里存储的字符数组,然后转换为字符串
            for (int i = 0; i < arr.Count; i++)
            {
                byte[] buffer = (byte[])method.Invoke(arr[i], null);
                //使用当前编码得出已经存储到HttpWriter._buffers中的字符串
                sb.Append(Response.ContentEncoding.GetString(buffer));
            }
            //获取HttpWriter的字符数组缓冲区
            char[] charBuffer = (char[])Response.Output.GetType().GetField("_charBuffer", bind).GetValue(Response.Output);
            int charBufferLength = (int)Response.Output.GetType().GetField("_charBufferLength", bind).GetValue(Response.Output);
            int charBufferFree = (int)Response.Output.GetType().GetField("_charBufferFree", bind).GetValue(Response.Output);
            //charBufferLength - charBufferFree 等于字符数组缓冲区已经使用的字符数量
            for (int i = 0; i < charBufferLength - charBufferFree; i++)
            {
                sb.Append(charBuffer[i]);
            }
            string html = sb.ToString();
            return html;
        }
    }
				
时间: 2025-01-12 13:21:38

asp.net 使用HttpModule对全站输出的动态页面的HTML内容进行修改,不会错乱的相关文章

asp.net 使用页适配器和重写Render对全站输出的页面的HTML内容进行修改,不会错乱

两个比较重点的知识: 1.使用页适配器:http://www.cnblogs.com/sifang2004/archive/2006/05/31/414182.html 如果用新建一个pageBase:Page 来给所有页面继承,程序改动非常大,还有可能改少了.使用页适配器刚好可以达到可插拔的效果,功能又一样. 2.重写Render:http://www.cnblogs.com/mxw09/archive/2010/12/15/1906783.html 链接里的文章说的很清楚了,使用传统的法写会

ASP.NET-自定义HttpModule与HttpHandler

在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中,这时,就是Http Modules和HttpHandler出场的时候了. 再来摆出管道工作时序图来一看: HttpModule HttpModule是类似于过滤器的作用,可以没有,也可以有任意个,每一个都可以订阅管道事件中的任意个事件,在每个订阅的事件中可自定义功能实现. HttpModule是实现IHttpModule接口的类.接口如下

asp.net 不用控件 循环输出数据库数据的方法

不使用什么repeater gridview之类的控件,怎么才能输出数据库的数据到一个table ,我用response.write在后台,拼接 table 代码可以输出 但总是在页面的最上面 , 是不是要在aspx页面相应位置用<% %> 循环输出 但又提示找不到我后台填充的DATASET,因为听说公司做asp.net是不用控件的,想知道他们是怎么做输出数据库表格的,还请高手帮帮忙,谢谢了. 不明白来问我后台代码public string test = "";    pr

(转)win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案

本文转载自:http://www.cnblogs.com/finesite/archive/2011/01/28/1946940.html 网上搜的解决方案但在我的环境下仍旧没有解决,我的方法如下: 给C:\Windows\temp 文件夹赋予完全控制权限,如图: 其他的解决方案均没有成功如: 1 设置c:windows\temp 目录访问权限 temp--> 属性-->安全-- > 添加network service -->并赋予其权限为 读 和 写--> 确定 (注意:操

Asp.net导出Excel(HTML输出方法)

主要思路: 实例化Gridview,将值绑定后输出...(用烂了的方法) 贴上核心代码: public static void ExportToExcel(DataTable dataList, string[] fields, string[] headTexts, string title, string TableName) { GridView gvw = new GridView(); int ColCount, i; //如果筛选的字段和对应的列头名称个数相对的情况下只导出指定的字段

ASP函数:根据表和ID和字段名,返回内容

'//根据表和ID和字段名,返回内容Function dsf_fieldValueFromTable(fTable,id,fieldName) dim rs,sql set rs=server.createobject("adodb.recordset") sql="select * from " & fTable & " where id=" & id rs.open sql,conn,1,1 if not rs.eof

Asp.net中使用文本框的值动态生成控件的方法

这篇文章主要介绍了Asp.net中使用文本框的值动态生成控件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个"花"字,点一下"生成"按钮,就会在下面生成一个checkbox,它的text属性是"花".再输入一个"鸟",点一下按钮,就会生成第二个checkbox控件,text属性是"鸟"... Insus.NET的解决方法

输出任何一个一维数组的内容

输出任何一个一维数组的内容 # include <stdio.h> //f函数可以输出任何一个一维数组的内容 void f(int * pArr, int len) { int i; for (i=0; i<len; ++i) printf("%d ", *(pArr+i) ); //*pArr *(pArr+1) *(pArr+2) printf("\n"); } int main(void) { int a[5] = {1,2,3,4,5};

ASP.NET——实现两个下拉框动态联动

引入: 在网页中,我们经常会遇到下图中的情况.首先在下拉框中选择所在的省,选择之后,第二个下拉框会自动加载出该省中的市.这样设计极大的方便了用户的查找.那这是如何实现的呢? 1.建立数据库 "省"表 "市"表 2.添加控件 3.两个下拉框分别绑定数据源 protected void Page_Load(object sender, EventArgs e) { //判断是否第一次进入页面,如果是,则绑定数据库:如果不是,则无需绑定. if (!this.IsPost