http运行时基本结构

1HTTP运行时指从IIS接受用户请求到响应结果返回给用户为止。

2、简述:

    (1)运行时首先创建HttpApplication对象实例来处理请求。

2)然后按照配置文件(machine.configweb.config)的要求,按照在配置文件中定义的顺序依次调用若干HttpModule类,并触发这些类的方法。

3)而HttpModule会按照配置文件来调用相应的HttpHandle类处理请求。HttpHandle是真正处理请求的容器(Page类就是一个httphandle)。(注:此处并非在处理httpmodule时中断去调用httphandle

(注:并非直接定位到httphandle上,而是先到IHttpHandlerFactory上,然后根据设计模式的工厂模式,制造出对应的httphandle来)。

4Httphandle处理完请求后控制权又回到了httpmodule继续其他module

5)所有httpmodule运行完后,将响应内容交给iis。如框图所示:

 

 

 3、细述:HttpApplication类。

Httpapplication实例不是用户创建的。其中定义了很多事件,事件顺序如下图,可知在事件Pre-execute Handler执行后才进入HttpHandle中执行(即page类才开始有效)。

HttpApplication类的CompleteRequest()方法的作用是中断其他事件的执行。直接执行EndRequest。其Context属性是一个HttpContext类对象,包含了HttpRequestHttResponse对象。

    所有运行时信息封装于HttpAplication,请求信息封装于HttpContext

 

 

4、自定义HttpModule处理HttpApplication流程中的事件。

(1)继承IHttpModule接口

其中有两个方法必须实现

void dispose()  //清理工作

void Init(HttpApplication context)  //使用HttpApplication的关键所在

(2)举例:

using System.Web;

using System;

namespace LearnDotNet35.Module

{

    public partial class BreakModule : IHttpModule

    {

        public void Dispose()

        {

        }

        public void Init(HttpApplication application)

        {

            application.BeginRequest += new 

EventHandler(application_BegionRequest); //设定事件处理函数

        }

        void application_BegionRequest(object sender,EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.CompleteRequest();

            application.Context.Response.Write("对不起,不能访问!");

        }

    }

}

 

配置文件的module模块增加配置:

<add name="BreakModule" type="LearnDotNet35.Module.BreakModule"/>

 

注:也可以在global.asax中文件处理HttpApplication事件。

 

5、自定义HttpHandle模块处理请求(会覆盖默认的处理器?)。如:

using System.Web;

using System;

namespace LearnDotNet35.Handler

{

    //配置文件中httpHandle中增加配置:<add verb="*" path="*.aspx" validate="true" type="LearnDotNet35.Handler.MyAspxHandle"/>

    public partial class MyAspxHandle : IHttpHandler

    {

        public bool IsReusable { get { return true; } }

 

        public void ProcessRequest(HttpContext context)

        {

            context.Response.Write("读不起!不能访问!handle");

        }

    }

}

注:IHttpHandler接口中最重要的方法ProcessRequest,这个方法就是HttpHandler用来处理一个Http请求,当一个Http请求经过由HttpModule容器传递到HttpHandler容器中的时候,framework会调用HttpHandlerProcessRequest方法来做对这个Http请求做真正的处理。

Path用于指定此IHttpHandle类处理的文件路径。

 

 

另外还可以自定义HttpHandleFactory实现工厂类选择制造自己的httpHandle

利用反射机制:

Object handle=null;

Activator.CreateInstance(Type.GetType(className));//className是自己指定的。

return (IHttpHandle)handle;

 

posted on 2011-05-08 22:48  windfree  阅读(330)  评论(0)    收藏  举报