zoukankan      html  css  js  c++  java
  • 采用HttpModules来重写URLs(实践篇)

    首先写一个处理URLs重写的类,并且这个类必须继承IHttpHandler接口,以博客园的程序为例:

    public class UrlReWriteModule : System.Web.IHttpModule
    {
        public void Init(HttpApplication context)
        {
           context.BeginRequest +=new EventHandler(context_BeginRequest);
        }

       public void Dispose()
       {
       }
    }

    UrlReWriteModule类就是处理URLs重写的类,继承IHttpHandler接口,实现该接口的两个方法,Init和Dispose。在Init方法里注册自己定义的方法,如上例所示:

    content.BeginRequest +=new EventHandler(content_BeginRequest);

    BeginRequest是一个事件,在收到新的Http请求时触发,content_BeginRequest就是触发时处理的方法。另外说明一 点,HttpModules能注册的方法还有很多,如:EndRequest、Error、Disposed、 PreSendRequestContent等等。

    在content_BeginRequest方法中具体处理URLs重写的细节,比如,将 http://www.cnblogs.com/rrooyy/archive/2004/10/24/56041.html 重写为 http://www.cnblogs.com/archive.aspx?user=rrooyy&id=56041 (注:我没有仔细看DuDu的程序,这里只是举例而已)。然后将重新生成的Url用HttpContext.RewritePath()方法重写即可,如下:

    private void context_BeginRequest(object sender, EventArgs e)
    {
        HttpContext context  = ((HttpApplication)sender).Context;
        // 获取旧的Url
        string url = context.Request.Path.ToLower();
        // 重新生成新的Url
        string newUrl = ...; // 具体过程略
        // 重写Url
        context.RewritePath(newUrl);
    }

    提醒:newUrl的格式不是http://www.infotouch.com/user/archive.aspx,而是从当前应用程序根目录算起的绝对路径,如:user\archive.aspx,这一点请特别注意。

    最后要web.config中注册重写URLs的类,格式如下:

    <HTTPMODULES>
       <ADD type="classname,assemblyname" name="modulename"/>
       <REMOVE name="modulename"/>
       <CLEAR />
    </HTTPMODULES>

    采用<ADD>标签可以注册一个类;<REMOVE>可以移除某个类,如果某个子目录不希望继承父目录的某个Http Module注册,就需要使用这个标签;<CLEAR />可以移除所有的Http Module注册。

  • 相关阅读:
    window.open 子窗口关闭刷新父页面
    window.open打开新窗口报错ie 位指明错误,原因是window没有加引号!
    ORA-22922: 不存在的 LOB 值 可以使用外层嵌套wm_concat()解决
    子窗口打开父窗口
    页面加载时触发事件
    json
    orcale 函数wm_concat不存咋lob值使用zh_concat 替换
    mongo常见错误
    mongo中插入数据,出现id重复
    cpu占用率
  • 原文地址:https://www.cnblogs.com/top5/p/1567982.html
Copyright © 2011-2022 走看看