处理IHttpHandler和IHttpModule接口来做流量分析系统
摘要:网上有好多网站的流量分析系统,但是大多很难做到对每个页的访问统计的,因为要asp时代,要获取http请求要写ISAPI过滤器或者ISAPI扩展才可以做到,但是.NET下就非常方便了,我做了一个例子来演示如何捕获用户的访问请求,并把它记录下来,我演示的只是把访问的页面记录了下来,其实只要获取了request的引用,象客户的IP,浏览器类型,版本,访问时间,错误号等都可以记录的。而且我是把这些记录保存在了一个xml文件里,这适合访问量比较少的情况,xml配合一个xslt就可以显示多种形式的统计报表了,如果流量大的话,可以把他们保存到数据库里,并且建立一个作业,每隔固定时间汇总这些数据,删除旧数据,然后单独写个程序以这个数据库为基础创建报表。我们这里只关注原始数据的捕获,有了数据,想怎么处理就怎么处理,下次我给大家演示如何把这些数据以图表的形式展现出来,可能用OWC,也可能给大家演示一个VMLChart系统。
下面是系统的源码,为了让代码紧凑,我去掉了所有的注释,要想了解具体技术细节,请查看MSDN和我后面推荐的两篇文章。
关键字:IHttpHandler,IHttpModule,XmlTextWriter,XmlDocument,XmlTextReader
using System;
using System.Web;
using System.IO;
using System.Xml;
namespace WawaHttp
{
public class MyHandler:IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
ctx.Response.Write("呱呱!");
}
public bool IsReusable
{
get { return true; }
}
}
public class MyModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.BeginRequest += (new
EventHandler(this.Application_BeginRequest));
application.EndRequest += (new
EventHandler(this.Application_EndRequest));
}
private void WriteXmlDoc(HttpContext ctx)
{
HttpRequest request = ctx.Request;
XmlTextWriter xwriter = new XmlTextWriter(ctx.Server.MapPath("log.xml"),System.Text.Encoding.UTF8);
xwriter.WriteStartDocument(true);
xwriter.WriteStartElement("log","onlytiancai.cnblogs.com");
xwriter.WriteElementString("list","onlytiancai.cnblogs.com",request.Url.ToString());
xwriter.WriteEndElement();
xwriter.WriteEndDocument();
xwriter.Close();
}
private void AddElement(HttpContext ctx)
{
XmlTextReader reader = new XmlTextReader(ctx.Server.MapPath("log.xml"));
try
{
HttpRequest request = ctx.Request;
XmlDocument doc = new XmlDocument();
doc.Load(reader);
reader.Close();
XmlNode root = doc.DocumentElement;
XmlElement elem = doc.CreateElement("list","onlytiancai.cnblogs.com");
elem.InnerText = request.Url.ToString();
root.AppendChild(elem);
doc.Save(ctx.Server.MapPath("log.xml"));
}
catch(Exception e)
{
throw e;
}
}
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication Application = (HttpApplication)source;
HttpContext ctx=Application.Context;
if(File.Exists(ctx.Server.MapPath("log.xml")))
{
AddElement(ctx);
}
else
{
WriteXmlDoc(ctx);
}
}
private void Application_EndRequest(Object source, EventArgs e)
{
}
public void Dispose()
{
}
}
}
创建一个asp.net程序,随笔添加几个页面,然后在添加个叫test.wawa的文件,然后在IIS里的扩展里把.wawa文件让处理asp.net的那个程序处理(具体步骤参考我后面推荐的文章,不再多说),把上面的源码编译后把生成的WawaHttp.dll拷贝到新的asp.net程序的bin目录里,然后运行这个程序,随便点点你做的那些页面,然后看看在你的程序目录里是不是有个叫log.xml的文件呢?然后看看内容吧。最后浏览一下text.wawa,哈哈,是不是我写的“呱呱”就出来了呢,这说明一切在意料之中。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.wawa" type="WawaHttp.MyHandler,WawaHttp"></add>
</httpHandlers>
<httpModules>
<add name="MyModule" type="WawaHttp.MyModule,WawaHttp"></add>
</httpModules>
</system.web>
</configuration>
本示例着重功能演示和思路启发,不讲解详细原理,具体原理看我后面推荐的文章。
ASP.Net中自定义Http处理及应用之HttpHandler
http://tech.ccidnet.com/pub/disp/Article?columnID=294&articleID=34991&pageNO=1
ASP.Net中自定义Http处理及应用之HttpModule篇
http://tech.ccidnet.com/pub/article/c294_a34994_p1.html