代码DEMO:http://files.cnblogs.com/peaceli/httpModuleTest.rar
因项目需要,对每一个访问网站的请求要做原始数据记录,其中要包括几个要素:
1.客户端的IP
2.客户端请求的页面路径
3.客户端发出的请求头
4.服务器返回的正文内容。
在代码设计前分析了一下,前三个都很好解决,对于截获服务器返回的正文,准备用HttpResponse 对象中的Output 和 OutputStream 属性输出信息来解决。
可是在正式编码的过程中,发现Output和OutputStream 并不是想像中可以直接把数据转出取回,耗费了近两天的时间,想尽了一切办法可还是仅仅可以追加内容并无法读取。
在网上查阅到,对于HttpResponse 对象,仅仅可以使用过滤器来对其中将要输出的内容进行修改。
这个过滤器要继承自Stream 类,并要实现其中的虚方法。看来之前企图使用HttpWriter,TextWriter,Stream,HttpStream 这些类来转出数据完全是错误的。
现在有信心来截获服务器返回内容了,说干就干吧!
1.首先要建立一个简易过滤器。
代码如下:
].ToLower() ==
"aspx")
{
//装配过滤器
application.Response.Filter =
new RawFilter(application.Response.Filter);
//绑定过滤器事件
RawFilter filter = (RawFilter)application.Response.Filter;
filter.OnRawDataRecordedEvent +=
new EventHandler<RawDataEventArgs>(filter_OnRawDataRecordedEvent);
}
}
/**////
<summary>
/// 当原始数据采集到以后,入库
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
void filter_OnRawDataRecordedEvent(object sender, RawDataEventArgs e)
{
string allcode = e.SourceCode;
WapSite.SiteDataClass wapdata =
new WapSite.SiteDataClass();
wapdata.WriteRawDataLog(allcode);
}
}
HttpModule 准备完毕,也装配上了过滤器,接下来还需要在配置文件中配置HttpModules配置节 ,把自定义的HttpModule 加入到HTTP处理管道中。
在Web.config 中增加配置节如下:
<system.web>
<httpModules>
<add name="RawDataModule" type="HttpRawDataModule"/>
</httpModules>
</system.web>
测试成功,能准确的获得服务器向客户端输出的HTML内容。
其中,在过滤器中,可以直接对即将要输出的内容做 对于字符串的任意处理。
而且采用这样的方式来对站点即将输出的内容做修改和采集,可以通过修改配置文件,随时打开和关闭,有很强的优越性和灵活性还有重用性。
记得看到过很多需要产生静态页面的网站,都是通过代码HttpWebRequest 向自己请求并记录返回的代码产生静态页面,不知道我当前介绍的方法是否更好写,比如需要产生静态页面时,不管是谁发出请求,由服务器检查自己是否有静态页面,否则产生静态页面,并转向。给出引子,希望大家还是自己开阔思路比较好。