Http在.net frameword中处理流程如下:
HttpRequest - >inetinfo.exe ->aspnet_isapi.dll
-> Http Pipeline -> ASPNET_WP.EXE
-> HttpRuntime -> HttpApplication Factory -> HttpApplication
-> HttpModule--> HttpHandler Factory -> HttpHandler
-> HttpHandler.ProcessRequest()
下面且听细细说来,
当客户端向web服务器请求 *.aspx页面时,这个http 被inetinfo.exe 进程截获,判断文件的后缀名后,由aspnet_isapi.dll(本人计算机物理路径C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727) asp.net_isapi.dll通过Http Pieline管道,将这个Http 请求发送给aspnet_wp.ext进程,进入进程后,由.net framework 通过HttpRunTime来处理http请求。当http请求进入HttpRunTime后,会被送入一个HttpApplication Factory 容器 这个容器会给出一个HttpApplication实例来处理Http请求,之后依次进去其余的容器
重点介绍 HttpModule和HttpHandler
HttpModule
主要被用于在最开始的阶段处理一个请求以及在最后阶段处理一个响应。 一个Http请求在被ASP.NET Framework捕获之后会依次交给HttpModule以及HttpHandler来处理。hm与hh之间不是完全独立的,实际上,http请求在hm传递的过程中会在某个事件内将控制权转交给hh的,而真正的处理在HttpHandler中执行完成后,HttpHandler会再次将控制权交还给HttpModule
上面的代码中的HttpModule的Init()中的参数是HttpApplication类型,它具有许多事件,包括BeginRequest,EndRequest,AuthentiacteRequest 等等。
实例代码如下:
在网站目录下,新建一个类
namespace WebApplication1
{
public class Class1:IHttpModule
{
#region IHttpModule 成员
public void Dispose()
{
//throw new NotImplementedException();
}
public void Init(HttpApplication context)
{
//throw new NotImplementedException();
context.Context.Cache["a"]="a";
}
#endregion
}
}
aspx后台代码
namespace WebApplication1 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { HttpModulesTest(); } private void HttpModulesTest() { if (Cache["a"] != null) { Response.Write(Cache["a"].ToString()); } else { Response.Write("no"); } } } }
在web.config配置
<system.web> <httpModules> <add name="test" type="WebApplication1.Class1" /> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpModules> </system.web>
最后结果输出 a
HttpHandlers
处理对某种特定文件或者在URL中对某个文件路径的请求。
示例代码如下:
新建类继承IHttpHandler
public class Class2:IHttpHandler { #region IHttpHandler 成员 public bool IsReusable { get { //throw new NotImplementedException(); return false; } } public void ProcessRequest(HttpContext context) { //throw new NotImplementedException(); context.Response.Write("aaa"); } #endregion }
在web.config配置如下
<httpHandlers> <add verb="*" path="*.aspx" type="WebApplication1.Class2, WebApplication1 "/> <-- 注意哦! type格式“空间名.类名,程序集名”--> </httpHandlers>
最后请求.aspx文件都是输出aaa .