关系图:
页面事件管道
For Http Module:
对于每个请求,所有的http模块都将通过。
如果有多个模块,执行顺序? 例如 :模块A,订阅
EndRequest
模块B,它订阅了
BeginRequest
和EndRequest
模块C,订阅
AuthenticateRequest
执行的顺序是:
模块B,BeginRequest
模块C,AuthenticateRequest
模块A,EndRequest
模块B,EndRequest
For Http Handler
对于每个请求,只有一个处理程序将被映射到执行一些逻辑,这取决于web.config中的配置。
配置:for http module :
<system.webServer>
<modules>
<addnameaddname="urlRewrittingModule"type="WebCode.asp.net.HttpModule.UrlRewriterModule"/>
</modules>
</system.webServer>
配置:for http handler:
<system.webServer>
<handlers>
<addverbaddverb="*" name="urlRewritingHandler" path="*.aspx"type="WebCode.asp.net.HttpHandler.UrlRewriterHandler"/>
</handlers>
</system.webServer>
使用时机
Http Handler
每当想要处理一些请求,但不需要UI页面
Http Module
Authentication ,Application log , Auditing , URLRewriting
代码示例:
http module(使用 http module 重写url) :
public class UrlRewriterModule : IHttpModule
{
public void Dispose()
{
//清理代码在这里
}
public void Init(HttpApplication context)
{
context.AuthenticateRequest += ContextOnAuthenticateRequest;
context.BeginRequest += ContextOnBeginRequest;
context.AuthorizeRequest += context_AuthorizeRequest;
context.PreRequestHandlerExecute += ContextOnPreRequestHandlerExecute;
context.PostRequestHandlerExecute += ContextOnPostRequestHandlerExecute;
context.EndRequest += ContextOnEndRequest;
}
#region BEFOREhandler
private void ContextOnPreRequestHandlerExecute(objectsender, EventArgs eventArgs)
{
}
private void context_AuthorizeRequest(object sender, EventArgs e)
{
}
private void ContextOnBeginRequest(object sender, EventArgs eventArgs)
{
//测试URLrewritten
var context = ((HttpApplication)sender).Context;
if(context.Request.RawUrl.Contains("ExploreRedirect"))
{
context.RewritePath("ExploreRedirect.aspx","","SN="+ Guid.NewGuid());
}
}
private void ContextOnAuthenticateRequest(object sender, EventArgs eventArgs)
{
}
#endregion
#region AFTERhandler
private void ContextOnEndRequest(object sender, EventArgs eventArgs)
{
}
private void ContextOnPostRequestHandlerExecute(object sender, EventArgs eventArgs)
{
}
#endregion
}
http handler:
public class UrlRewriterHandler : IHttpAsyncHandler
{
public void ProcessRequest(HttpContext context)
{
//dosomething
}
private Action<HttpContext> _process;
public bool IsReusable { get; private set; }
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, objectextraData)
{
_process =ProcessRequest;
return _process.BeginInvoke(context, cb, extraData);
}
public void EndProcessRequest(IAsyncResult result)
{
_process.EndInvoke(result);
}
}