在以前的ASP时候当请求一个*asp页面文件的时候这个HTTP请求首先会被一个名为inetinfoexe进程所截获这个进程实际上就是www服务截获之后它会将这个请求转交给aspdll进程这个进程就会解释这个asp页面然后将解释后的数据流返回给客户端浏览器其实ASPDLL是一个依附在IIS的ISAPI文件它负责了对诸如ASP文件ASA等文件的解释执行
-------------------------------------
ASPNET的HTTP请求处理方法
当客户端向web服务器请求一个*aspx的页面文件时同asp类似这个http请求也会被inetinfoexe进程截获(www服务)它判断文件后缀之后把这个请求转交给ASPNET_ISAPIDLL而ASPNET_ISAPIDLL则会通过一个Http PipeLine的管道将这个http请求发送给ASPNET_WPEXE进程当这个HTTP请求进入ASPNET_WPEXE进程之后 framework就会通过HttpRuntime来处理这个Http请求处理完毕后将结果返回给客户端
------------------------------------
当一个http请求被送入到HttpRuntime之后这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中而这个容器会给出一个HttpApplication实例来处理传递进来的http请求而后这个Http请求会依次进入到如下几个容器中
当系统内部的HttpHandler的ProcessRequest方法处理完毕之后整个Http Request就被处理完成了客户端也就得到相应的东东了
完整的http请求在 framework中的处理流程
如果想在中途截获一个httpRequest并做些自己的处理就应该在HttpRuntime运行时内部来做到这一点确切的说时在HttpModule这个容器中做到这个的
----------------------------------------
系统本身的HttpModule实现一个IHttpModule的接口当然我们自己的类也能够实现IHttpModule接口这就可以替代系统的HttpModule对象了
系统中默认的HttpModule
DefaultAuthenticationModule 确保上下文中存在 Authentication 对象无法继承此类
FileAuthorizationModule 验证远程用户是否具有访问所请求文件的 NT 权限无法继承此类
FormsAuthenticationModule 启用 ASPNET 应用程序以使用 Forms 身份验证无法继承此类
PassportAuthenticationModule 提供环绕 PassportAuthentication 服务的包装无法继承此类
SessionStateModule 为应用程序提供会话状态服务
UrlAuthorizationModule 提供基于 URL 的授权服务以允许或拒绝对指定资源的访问无法继承此类
WindowsAuthenticationModule 启用 ASPNET 应用程序以使用 Windows/IIS 身份验证无法继承此类
--------------------------------------
这些系统默认的HttpModule是在文件nfig中配置的和我们开发时使用到的nfig的关系是是在ASPNET FRAMEWORK启动处理一个Http Request的时候它会依次加载nfig和请求页面所在目录的nfig文件如果在machine中配置了一个自己的HttpModule你仍然可以在所在页面的nfig文件中remove掉这个映射关系
深入HttpModule
publicclassHelloWorldModule:IHttpModule
{
publicHelloWorldModule()
{
}
publicStringModuleName
{
get{returnHelloWorldModule;}
}
//IntheInitfunctionregisterforHttpApplication
//eventsbyaddingyourhandlers
publicvoidInit(HttpApplicationapplication)
{
applicationBeginRequest+=
(newEventHandler(thisApplication_BeginRequest));
applicationEndRequest+=
(newEventHandler(thisApplication_EndRequest));
}
privatevoidApplication_BeginRequest(Objectsource
EventArgse)
{
//CreateHttpApplicationandHttpContextobjectstoaccess
//requestandresponseproperties
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=applicationContext;
contextResponseWrite(
HelloWorldModule:BeginningofRequest
);
}
privatevoidApplication_EndRequest(ObjectsourceEventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=applicationContext;
contextResponseWrite(
HelloWorldModule:EndofRequest
);
}
publicvoidDispose()
{
}
}
一个Http请求在被ASPNET Framework捕获之后会依次交给HttpModule以及HttpHandler来处理hm与hh之间不是完全独立的实际上http请求在hm传递的过程中会在某个事件内将控制权转交给hh的而真正的处理在HttpHandler中执行完成后HttpHandler会再次将控制权交还给hh的而真正的处理在HttpHandler中执行完成后HttpHandler会再次将控制权交还给HttpModule
上面的代码中的HttpModule的Init()中的参数是HttpApplication类型它具有许多事件包括BeginRequestEndRequestAuthentiacteRequest 等等
IHttpHandler
它是 Framework提供的一个接口定义了如果要实现一个Http请求的处理所需要必须实现的一些系统约定也就是说如果你想要自行处理某些类型的HTTP请求信息流的话你需要实现这些系统约定才能做到譬如一个*aspx文件用来处理此类型的Http请求ASPNET FRAMEWORK将会交给一个名为SystemWebUIPageHandlerFactory的HttpHandler类来处理
HH和HM一样系统会在最初始由ASPNET FRAMEWORK首先加载nfig中的HttpHandler而后会加载Web应用程序所在目录的nfig中的用户自定义的HttpHandler类但是系统与我们自定义的HH之间的关系是覆盖的也就是说如果我们自定义了一个针对*aspx的HttpHandler类的话那么系统会将对此http请求的处理权完全交给我们自己定义的这个HttpHandler类来处理而我们自己的HttpHandler类则需要自己完全解析这个Http请求并作出处理
接口中最重要的方法ProcessRequest这个方法就是HttpHandler用来处理一个Http请求当一个Http请求经过由HttpModule容器传递到HttpHandler容器中的时候framework会调用HttpHandler的ProcessRequest方法来做对这个Http请求做真正的处理
framework实际上并不是直接把相关页面的HTTP请求定位到一个内部默认的IHttpHandler容器之上的而是定位到了其 内部默认的IHttpHandler Factory上了IHttpHandler Factory的作用就是对很多系统已经实现了的IHttpHandler容器进行调度和管理的这样做的优点是大大增强了系统的负荷性提升了效率