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

 

摘要:网上有好多网站的流量分析系统,但是大多很难做到对每个页的访问统计的,因为要asp时代,要获取http请求要写ISAPI过滤器或者ISAPI扩展才可以做到,但是.NET下就非常方便了,我做了一个例子来演示如何捕获用户的访问请求,并把它记录下来,我演示的只是把访问的页面记录了下来,其实只要获取了request的引用,象客户的IP,浏览器类型,版本,访问时间,错误号等都可以记录的。而且我是把这些记录保存在了一个xml文件里,这适合访问量比较少的情况,xml配合一个xslt就可以显示多种形式的统计报表了,如果流量大的话,可以把他们保存到数据库里,并且建立一个作业,每隔固定时间汇总这些数据,删除旧数据,然后单独写个程序以这个数据库为基础创建报表。我们这里只关注原始数据的捕获,有了数据,想怎么处理就怎么处理,下次我给大家演示如何把这些数据以图表的形式展现出来,可能用OWC,也可能给大家演示一个VMLChart系统。

下面是系统的源码,为了让代码紧凑,我去掉了所有的注释,要想了解具体技术细节,请查看MSDN和我后面推荐的两篇文章。

关键字:IHttpHandlerIHttpModuleXmlTextWriterXmlDocumentXmlTextReader

 

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

你可能感兴趣的:(数据库,exception,object,application,asp.net,HttpModule)