Asp.net底层探秘之Http请求机制

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 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值