標籤:style blog http color io 使用 ar 檔案 div
使用HttpModule實現網址重寫和HttpHandler衝突的解決辦法
功能描述:
1. 用HttpModule做了一個重寫URL的功能,實現所有訪問html的請求要經過httpModule處理,如果頁面中有對應的aspx頁面,就轉寄到那個頁面,如果沒有,就轉寄到原來請求的那個頁面。
2. 但後面有做了一個使用HttpHandler是aspx頁面靜態化的功能,實現訪問某一類的頁面的時候,如果沒有就使用模板建立html頁面,如果有,就訪問已存在的頁面。
3. 做完上面兩步,使用html的方式訪問aspx頁面時沒問題,但訪問項目中已有的html頁面就有問題了,不是html檔案夾中的靜態化頁面不能訪問,就是其他html頁面無法訪問。
對於這個問題,有以下幾點應該注意:
1.httpModule頁面中:
技能點1:判斷是否存在對應的aspx頁面。如果存在aspx頁面,使用app.Context.RewritePath(newUrl)進行路徑重寫,這個不會與頁面中的session衝突。
技能點2:判斷沒有aspx頁面的html請求頁面是否是html靜態頁面檔案夾中的頁面。如果不是直接轉寄到請求的頁面,如果是,不進行處理,留給實現頁面靜態化的HttpHandler進行處理。
代碼如下:
public void BeginRequest(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; //app.Response.Write("開始處理請求!"); //4.1 截獲請求網址 string url = app.Request.RawUrl; //4.2 判斷網址是否符合要求,判斷是否進行重發到指定頁面 if (url.LastIndexOf(".html") > 0) { string newUrl = url.Substring(0,url.Length-4); //確定存在對應的aspx頁面才可以進行URl重寫 if (File.Exists(app.Server.MapPath(newUrl + "aspx"))) { //轉寄到指定頁面 app.Server.Transfer(newUrl + "aspx"); } else { //如果沒有對應的aspx頁面,要再次判斷是否為html檔案夾下的靜態頁面 //如果是靜態頁面的請求,不進行處理,如果不是進行轉寄 //app.Response.Write(url.LastIndexOf("html/") > 0); if(url.LastIndexOf("html/")<= 0) { app.Server.Transfer(url);//轉寄請求的網址 } } } }
使用HttpModule實現網址重寫和HttpHandler實現頁面靜態化衝突的解決辦法