HttpModule学习笔记
在微软的网站上找到了篇关于HttpModule的文章发现这个技术非常的好,他能为我们的安全带来好处.
那么HttpModule到底是干什么的呢?
HttpModule是向实现类提供模块初始化和处置事件。
首先你要实现IHttpModule接口这个接口只有两个方法,一个是Init方法一个Dispose方法.一看方法的名字就知道了这两个方法一个是在加载前调用的,一个是Dispose时调用的(页面最后处理的一个事件).
下面代码说明了如何在所有的页面加载之前和结束写入一段文字:
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// HelloWorldModule 的摘要说明
/// </summary>
public class HelloWorldModule : IHttpModule
{
public HelloWorldModule()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
string str = "";
public String ModuleName
{
get { return "HelloWorldModule"; }
}
public void Init(HttpApplication application)
{
//注册页面请求开始和结束事件
application.BeginRequest +=
(new EventHandler(this.Application_BeginRequest));
application.EndRequest +=
(new EventHandler(this.Application_EndRequest));
}
private void Application_BeginRequest(Object source, EventArgs e)
{
//在页面开始请求前写入一段文字
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write(@"<h1><font color=red>
HelloWorldModule: Beginning of Request
</font></h1><hr>"+
application.Request.QueryString.Count.ToString());
}
private void Application_EndRequest(Object source, EventArgs e)
{
//页面请求结束后写入一段文字
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write(@"<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");
}
public void Dispose()
{
}
}
在web.config增加下面配置:
<httpModules>
<add name="HelloWorldModule" type="HelloWorldModule"/>
</httpModules>
上面是个小例子.那我们可以在这里做多少件事情呢?看下面的表就可以得出结论.
事件 |
说明 |
BeginRequest |
指示请求处理开始。 |
AuthenticateRequest PostAuthenticateRequest |
封装请求身份验证过程。 |
AuthorizeRequest PostAuthorizeRequest |
封装请求授权过程。 |
ResolveRequestCache PostResolveRequestCache |
封装检查是否能利用以前缓存的输出页面处理请求的过程。 |
PostMapRequestHandler |
指示已发现用于处理请求的 HTTP 处理程序。 |
AcquireRequestState PostAcquireRequestState |
封装对请求会话状态的检索。 |
PostRequestHandlerExecute |
指示用于处理请求的 HTTP 处理程序已执行。 |
ReleaseRequestState PostReleaseRequestState |
封装对请求会话状态的发布。 |
UpdateRequestCache PostUpdateRequestCache |
封装检查是否应对请求的资源的输出进行缓存以备今后重复使用的过程。 |
EndRequest |
指示请求处理结束。 |
我们可以根据相应的事件来进行处理.做了这么长时间才发现你没想到的微软都替你想到了.
在httpModule中到底要做什么?我根据一个朋友的文章写了个根据配置文件来验证页面的连接字符串的传参个数和传参的内容是否符合标准的例子.
还有个朋友给我说了,这个可以用来修改跳转Url的改写.
在CommunityServer中还用httpModule做了当异常处理的时候进行程序异常的页面打印的操作.
AuthenticateRequest 请求身份验证和AuthorizeRequest请求授权过程的操作.
但是依然还是对这个东西很不解的就是为什么不可以写异常处理出来后进行页面跳转呢?我尝试了很多次,都是重复刷新同一个页面.不知道为什么?
如果httpModule写的过于臃肿那页面调用不就是很慢了吗?
那httpModule还在什么应用中使用.除了url重写,异常处理,身份验证,没有其他的了吗?很不解