採用HttpModules來重寫URLs(實踐篇)

採用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註冊。

發佈了20 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章