http运行时基本结构
1、HTTP运行时指从IIS接受用户请求到响应结果返回给用户为止。
2、简述:
(1)运行时首先创建HttpApplication对象实例来处理请求。
(2)然后按照配置文件(machine.config和web.config)的要求,按照在配置文件中定义的顺序依次调用若干HttpModule类,并触发这些类的方法。
(3)而HttpModule会按照配置文件来调用相应的HttpHandle类处理请求。HttpHandle是真正处理请求的容器(Page类就是一个httphandle)。(注:此处并非在处理httpmodule时中断去调用httphandle)
(注:并非直接定位到httphandle上,而是先到IHttpHandlerFactory上,然后根据设计模式的工厂模式,制造出对应的httphandle来)。
(4)Httphandle处理完请求后控制权又回到了httpmodule继续其他module。
(5)所有httpmodule运行完后,将响应内容交给iis。如框图所示:

3、细述:HttpApplication类。
Httpapplication实例不是用户创建的。其中定义了很多事件,事件顺序如下图,可知在事件Pre-execute Handler执行后才进入HttpHandle中执行(即page类才开始有效)。
HttpApplication类的CompleteRequest()方法的作用是中断其他事件的执行。直接执行EndRequest。其Context属性是一个HttpContext类对象,包含了HttpRequest和HttResponse对象。
所有运行时信息封装于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会调用HttpHandler的ProcessRequest方法来做对这个Http请求做真正的处理。
Path用于指定此IHttpHandle类处理的文件路径。
另外还可以自定义HttpHandleFactory实现工厂类选择制造自己的httpHandle。
利用反射机制:
Object handle=null;
Activator.CreateInstance(Type.GetType(className));//className是自己指定的。
return (IHttpHandle)handle;
浙公网安备 33010602011771号