处理IHttpHandler和IHttpModule接口来做流量分析系统

处理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,哈哈,是不是我写的“呱呱”就出来了呢,这说明一切在意料之中。 本示例着重功能演示和思路启发,不讲解详细原理,具体原理看我后面推荐的文章。 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
posted @ 2006-12-05 16:26  wenanry  阅读(479)  评论(0编辑  收藏  举报