文章回顧:
鑒于園子裡有很多UrlRewrite的文章,是以就不略為簡單的講解了:
一:用ISAPI篩選器:即網上第三方釋出的比較常見的,如:RewriteEval.dll
2:我負責部落格使用者背景,另一同僚負責寫部落格前台
3:一女同僚負責寫js外挂
4:2個美工負責寫了好幾套模版
5:另一個同僚折騰了個中文轉拼音的。
6:一共花了3個月左右的時間,開發了出來。
以前7個人幹的活,現在,我一個人幹了,知道我有多不容易了吧。
還弄了個空間域名51xxdn,便宜沒好貨,150/一年的伺服器三天兩頭就打不開,一天到晚是和客服溝通。一年後站點到期後我就扔了,連備案過的域名也不要了。
當年使用第三方插件時,遇到麻煩的地方:
需要把dll送出給客服,然後還要教客服的技術人員怎麼添加,最可怕的是還要重新開機IIS才生效。
人家一個伺服器放那麼多網站,咋能随随便便的讓要求重新開機IIS呢?可是不重新開機你的站點又又打不開,是以每次還要挑無中午吃飯的時間重新開機,重新開機後還是不行,不行咋折騰?
過了一會客服技術又說行了,勉強運作了起來,後來發現該伺服器還是相當的經常性的重新開機IIS,因為站點老是打不開。
還有每次修改代碼修改或增加URL規則時,又得叫人家重新開機下IIS,唉,那個折騰,人家也折騰。
二:IHttpModule的RewritePath方法
自己來,怎麼來?用C++寫個ISAPI會不會?答:不會。
那就來點簡單的了:從Global.asax折騰到IHttpHandle,折騰了半天,搞錯了方向,轉來轉去還是在原地,後來經地的那麼一搜,才發現了,路子要走還得往IHttpModule上走。
用IHttpModule很容易,很多人都用這個折騰,寫個類繼承自IHttpModule,然後到配置檔案裡注冊一下就可以了,示例如下:
1:建立類庫項目:起名:UrlRewrite
2:添加引用System.Web,因為IHttpModule在這名稱空間下,而類庫預設是沒引用這個的
3:把Class1.cs更名為UrlRewrite.cs,并讓類繼承自IHttpModule,實作接口,最終如下:

把着我們把代碼小小調整一下如:
#region IHttpModule 成員
public void Dispose()
{
//throw new Exception("The method or operation is not implemented.");
}
public void Init(HttpApplication context)
context.BeginRequest += new EventHandler(context_BeginRequest);
void context_BeginRequest(object sender, EventArgs e)
HttpApplication app = (HttpApplication)sender;
HttpUrlRewrite(app.Context);
public void HttpUrlRewrite(HttpContext context)
string url = context.Request.Url.ToString();//使用者請求的Url
//--這裡要做很多Url邏輯處理
context.RewritePath("~/Default.aspx", null,"url="+url);
#endregion
上面的代碼,意思為:
将整個請求的url都當成參數送到Default.aspx頁面中,所有的請求都轉化為Default.aspx?url=www.cyqdata.com類似的方式
下面再建一個站點,來接受并輸出結果
4:添加建立網站起名:UrlRewriteDemo
ps:本來是要建應用程式的,怕大夥下載下傳示例時打不開,是以示例用網站形式
5:添加對UrlRewrite項目的引用
6:F5一下,調出web.config,然後在配置檔案添加配置項代碼如下:
< httpModules>
< add name="UrlRewrite" type="UrlRewrite.UrlRewrite,UrlRewrite" />
< /httpModules>
目前情況示例如圖:
然後到Default.aspx寫一行代碼輸出接收到的參數:
protected void Page_Load(object sender, EventArgs e)
Response.Write(Request["url"]);
一切就緒,運作,我們看結果:
圖1:請求預設存在的頁面,輸出結果,表示很正常
圖2:随便請求一個不存在頁面,輸出了結果,表示也很正常
圖3:請求一個連字尾都沒有的Url,輸出了結果,表示有點驚訝
從圖3看出,看來VS2005內建的IIS對所有的請求都統一處理了,是以連無字尾的也能處理
重點說明:
對于以IIS站點開發或最終部署來說,預設aspnet_isapi.dll是處理不了無字尾或圖檔等字尾的,是以,需要通過添加擴充“通用映射”能達到此功能。
從以上解析的内容可以看出,已經可以截取到使用者輸出的任意請求位址,包括無字尾。
那麼秋色園具體是如何處理各種請求的,讀取配置檔案得用正則解析還是說其它?
見下篇為你解析内部實作原理,敬請關注。
本文轉自cyq1162 51CTO部落格,原文連結:http://blog.51cto.com/cyq1162/499456,如需轉載請自行聯系原作者