zoukankan      html  css  js  c++  java
  • 处理IHttpHandler和IHttpModule接口来做流量分析系统

     

    处理IHttpHandlerIHttpModule接口来做流量分析系统

     

    摘要:网上有好多网站的流量分析系统,但是大多很难做到对每个页的访问统计的,因为要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

     

  • 相关阅读:
    apache+mysql+php+phpmyadmin搭建
    Redis学习笔记(1)Redis安装和启动
    Zlib 引用中出现的问题
    约数
    AC自动机
    当我们说“一切皆对象”时,我们到底在说什么
    Google翻译,3个步骤灭绝人类
    Linux下Gcc生成和使用静态库和动态库详解(转)
    Java基础&笔试题
    SQL基础&笔试题
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/202168.html
Copyright © 2011-2022 走看看