asp 地址映射 的定义是用户拜候 的虚拟地址 映射的实际文件,虚拟地址多是静态页面。如理:在拜候http://fuzhou.naoqiu/bus页面, 其实拜候的是/bus.aspx页面。
asp 地址映射是通过 HttpModule请求原理来完成工作。
httpModule原理是什么?
一 个HTTP请求在HttpModule容器的传递过程中,会在某一时刻(ResolveRequestCache事件)将这个HTTP请求传递给 HttpHandler容器。在这个事件之后,HttpModule容器会成立一个HttpHandler的入话柄例,可是此时并没有将HTTP请求节制 权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在 PreRequestHandlerExcute事件之后,HttpModule窗口就会将节制权暂时交给HttpHandler容器,以便进行真正的 HTTP请求措置工作。
而在HttpHandler容器内部会执行ProcessRequest体例来措置HTTP请求。在容器 HttpHandler措置完毕整个HTTP请求之后,会将节制权交还给HttpModule,HttpModule则会继续对措置完毕的HTTP请求信 息流进行层层的转交动作,直到返回到客户端为止。
借用博友图片
体会完原理后,我来完成一个 简单的地址映射,代码如下:
首先先完成地址映射基类:
///<summary>
/// 地址重写 /// </summary>
public abstract class BaseModuleRewriter: IHttpModule
{
/// <summary>
/// 初始化挪用 /// </summary>
/// <param name="app"></param>
public virtual void Init(HttpApplication app) {
app ginRequest += new EventHandler(app_BeginRequest);
}
public virtual void Dispose() { }
/// <summary>
/// 请求起头 /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected virtual void app_BeginRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
Rewrite(app);
}
/// <summary>
/// 操作的抽象体例 /// </summary>
/// <param name="app"></param>
protected abstract void Rewrite(HttpApplication app);
}
担当基类,完成需要地址映射操作:
protected override void Rewrite(HttpApplication app)
{
HttpContext context = app.Context;
HttpRequest request = app.Request;
string part = Regex.Match(request.Url.ToString(), @"(?<=http://).*").Value.ToLower().Trim('/');
if (part.IndexOf("/") == -1)
{
part = Regex.Match(part, @"^w+").Value;
switch (part)
{
case "bus": context.RewritePath("/bus.aspx"); break;
case "www":
case "naoqiu": context.RewritePath("/Default.aspx"); break;
default: context.RewritePath("/Index_City.aspx"); break;