您的位置:首页 > 理论基础 > 计算机网络

ASP.NET底层机制 (上) HttpModule

2007-10-02 11:19 323 查看
1.ASP时代的HTTP请求处理过程

System.Web.SessionState.SessionStateModule;

System.Web.Security.WindowsAuthenticationModule;

System.Web.Security.FormsAuthenticationModule;

System.Web.Security.PassportAuthenticationModule;

System.Web.Security.UrlAuthorizationModule;

System.Web.Security.FileAuthorizationModule;

IHttpModule接口分析:

public interface IHttpModule

//注意要在这个类库中添加System.Web引用

using System;

using System.Web;

namespace ClassLibraryModule

<httpModules>

<add name="Test" type="ClassLibraryModule.MyHttpModule,ClassLibraryModule"></add>

</httpModules>

name可以随意指定,没有影响。

type有两个参数,第一个表示具体哪个类,第二个表示是哪个dll

不需要在Web项目添加对类库的引用,只是复制一份到bin目录下即可

于是该站点下的每个页面都会Response.Write两句话——这适合做广告,只要替换成javascript即可

5.HttpModule内部事件机制

HttpApplication实例有很多事件,BenginRequest和EndRequest分别是HttpModule容器最开始的和最后的事件

<httpModules>

<add name="Test1" type="ClassLibraryModule.MyHttpModule1,ClassLibraryModule1"></add>

<add name="Test2" type="ClassLibraryModule.MyHttpModule2,ClassLibraryModule2"></add>

</httpModules>
这时,根据add标签的先后,依次执行:

Test1.BeginRequest

Test2.BeginRequest

.....

Test1.EndRequest

Test2.EndRequest

利用HttpModule实现当满足一定条件时终止此次HttpRequest:

在BeginRequest事件中,使用HttpApplication.CompleteRequest()方法

public void Application_BeginRequest(Object sender, EventArgs e)

{

HttpApplication application = (HttpApplication)sender;

HttpContext context = application.Context;

application.CompleteRequest();

context.Response.StatusCode = 500;

context.Response.StatusDescription = "Internal Server Error";

}

在BeginRquest中终止,但是仍然会调用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件——应该说直接跳转到EndRequest事件,而不会调用这期间的事件

如果有两个HttpModule,在第一个Module的BeginRequest中终止,仅仅不会调用第二个Module的BeginRequest,但仍然会调用两个EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。

以上两句话,可以用下图来表示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: