查看: 4|回复: 0

asp.net地址映射——伪静态

[复制链接]

主题

帖子

5

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5
发表于 7 天前 | 显示全部楼层 |阅读模式
asp.net地址映射 的定义是用户访问 的虚拟地址 映射的实际文件,虚拟地址可能是静态页面。如理:在访问页面, 其实访问的是/bus.aspx页面。
   
    asp.net地址映射是通过 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.BeginRequest += 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;
   
    }
   
    }
   
    }
   
    那么我们是否还差些什么? 是的,还差个配置文件的配置。需要修改web.config文件几处地方,代码如:
       !--请求规则--
    httpModules
    add name=BianminModuleRewriter
    type=Bianmin.URLRewriter.ModuleRewriter,Bianmin.URLRewriter /
    /httpModules
    system.webServer
    handlers
    add name=aspnet_isapi path=* verb=* modules=IsapiModule script Processor=C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll resourceType=Unspecified requireAccess=None preCondition=classicMode,runtimeVersionv4.0,bitness64 /
    /handlers
    defaultDocument
    files
    clear /
    add value=default.aspx /
    /files
    /defaultDocument
    /system.webServer
   
    注意:当您使用framewore 2..0需要更改\aspnet_isapi.dll文件路径
   
    源代码下载地址: 下载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们 | 联系我们| 招贤纳士 | 友情链接 | 客服中心| 网站地图

快速回复 返回顶部 返回列表