拦截asp.net输出流并进行处理的方法
本文实例主要实现对已经生成了HTML的页面做一些输出到客户端之前的处理。
方法的实现原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面输出都变成了向StringBuilder输出,然后我们对StringBuilder处理完成之后,再把Response的输出重定向到原来的页面上,然后再通过Response.Write方法把StringBuilder的内容输出到页面上。
这里之所以用反射,是因为Response对象的OutPut属性是只读的,通过反编译该类的程序集发现,OutPut实际上是内部私有成员 _writer来实现输出的。因此通过反射来改写该成员的值以实现输出流的重定向。
具体功能代码如下:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Text;
using
System.IO;
using
System.Reflection;
public
partial
class
_Default : System.Web.UI.Page
{
StringBuilder content =
new
StringBuilder();
TextWriter tw_old, tw_new;
FieldInfo tw_field;
protected
void
Page_Load(
object
sender, EventArgs e)
{
var context = HttpContext.Current;
tw_old = context.Response.Output;
//Response原来的OutPut
tw_new =
new
StringWriter(content);
//一个StringWriter,用来获取页面内容
var type_rp = context.Response.GetType();
//通过反射获取对象的私有字段
tw_field = type_rp.GetField(
"_writer"
, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
tw_field.SetValue(context.Response, tw_new);
}
protected
override
void
Render(HtmlTextWriter writer)
{
base
.Render(writer);
//替换回Response的OutPut
tw_field.SetValue(HttpContext.Current.Response, tw_old);
//做自己的处理
content.AppendLine(
"<!--江湖小子-->"
);
HttpContext.Current.Response.Write(content.ToString());
}
}
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Web;
using
System.Web.UI;
using
System.IO;
using
System.Text;
using
System.Reflection;
/// <summary>
///HttpModule 的摘要说明
/// </summary>
public
class
HttpModule : IHttpModule
{
private
HttpApplication _contextApplication;
private
TextWriter tw_new, tw_old;
private
StringBuilder _content;
private
FieldInfo tw_field;
public
void
Init(HttpApplication context)
{
_contextApplication = context;
_contextApplication.PreRequestHandlerExecute +=
new
EventHandler(_contextApplication_PreRequestHandlerExecute);
}
public
void
Dispose()
{
_contextApplication =
null
;
_contextApplication.Dispose();
}
public
void
_contextApplication_PreRequestHandlerExecute(
object
sender, EventArgs e)
{
HttpContext context = _contextApplication.Context;
var _page = context.Handler
as
System.Web.UI.Page;
_page.Unload +=
new
EventHandler(_page_Unload);
_content =
new
StringBuilder();
tw_old = context.Response.Output;
//Response原来的OutPut
tw_new =
new
StringWriter(_content);
//一个StringWriter,用来获取页面内容
var type_rp = context.Response.GetType();
tw_field = type_rp.GetField(
"_writer"
, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
tw_field.SetValue(context.Response, tw_new);
}
void
_page_Unload(
object
sender, EventArgs e)
{
//替换回Response的OutPut
tw_field.SetValue(HttpContext.Current.Response, tw_old);
//做自己的处理
_content.AppendLine(
"<!--江湖小子-->"
);
HttpContext.Current.Response.Write(_content.ToString());
}
}
拦截asp.net输出流并进行处理的方法的更多相关文章
- 拦截asp.net输出流做处理, 拦截HTML文本(asp.net webForm版)
对已经生成了HTML的页面做一些输出到客户端之前的处理 方法的原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面输出都变 成了 ...
- 拦截asp.net输出流做处理
本文标题是指对已经生成了HTML的页面做一些输出到客户端之前的处理. 方法的原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有的向页面 ...
- 拦截asp.net mvc输出流做处理, 拦截HTML文本(asp.net MVC版)
以前的一个贴子写过一个webForm的拦截HTML输出流的版本,最近用到mvc时用同样的方式发生一些问题. 如下图 查了好久也不知道啥原因. 好吧, 我最后选择放弃. 想起以前自定义Response. ...
- ASP.net MVC 文件下载的几种方法
ASP.net MVC 文件下载的几种方法(欢迎讨论) 在ASP.net MVC 中有几种下载文件的方法前提:要下载的文件必须是在服务器目录中的,至于不在web项目server目录中的文件下载我不 ...
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- 在Asp.Net MVC中用Ajax回调后台方法
在Asp.Net MVC中用Ajax回调后台方法基本格式: var operData = ...; //传递的参数(action中定义的) var type = ...; //传递的参数(action ...
- ASP.NET页面间数据传递的方法<转>
ASP.NET页面间数据传递的方法 作者: 灰色的天空2 来源: 博客园 发布时间: 2010-10-28 11:06 阅读: 822 次 推荐: 0 原文链接 [收藏] 摘要:本 ...
- 【转】asp.net Cookie值中文乱码问题解决方法
来源:脚本之家.百度空间.网易博客 http://www.jb51.net/article/34055.htm http://hi.baidu.com/honfei http://tianminqia ...
- [ASP.NET]asp.net Repeater控件的使用方法
asp.net Repeater控件的使用方法 -- : 4770人阅读 评论() 收藏 举报 asp.netserveraspdatasetdeletexhtml 今天学习了,Repeater控件 ...
随机推荐
- LoadRunner中调用SHA1算法加密字符串
参考<SHA-1 hash for LoadRunner>: http://ptfrontline.wordpress.com/2010/03/02/sha-1-hash-for-load ...
- java分页功能代码
import java.util.ArrayList; import java.util.List; /** * * @author cheney * * @date Aug 31, 2012 */ ...
- Python-文件修改器
#-*- coding: utf-8 -*- import os import sys import glob from PyQt4.QtGui import * from PyQt4.QtCore ...
- Nginx常用配置整理
1.全局块:配置影响nginx全局的指令.一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等. worker_pro ...
- mongodb - Replication Set搭建过程
1.创建目录 mkdir -p /mongodb/data/r1 mkdir -p /mongodb/data/r2 mkdir -p /mongodb/data/r3 mkdir -p /mongo ...
- 远程重启WIN服务器
- 转:BOOTSTRAP 增加、关闭、折叠TAB代码下载
http://git.oschina.net/hbbcs/bootStrap-addTabs
- Navicat Premium 快捷键
1.ctrl+q 打开查询窗口2.ctrl+/ 注释sql语句3.ctrl+shift +/ 解除注释4.ctrl+r 运行查询窗口的sql语句5.ctrl+shift+r 只运行选中的sql语句6. ...
- NOPcommerce研究
http://www.cnblogs.com/gusixing/archive/2012/04/07/2435873.html
- [转]c++ 为什么要将基类的析构函数声明为Virtual?
http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/12/2721410.html