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