ASP.NET中用IHttpModule接口實現僞靜態

 我們在開發網站的時候,會經常的用到get的方式來傳值,這樣,對我們來說,後臺代碼的實現是比較容易和方便的,但是,這種URL也會有相應的弊端,一個就是令我們經常頭疼的Sql注入,一個是可以不利於SEO(搜索引擎優化)。而僞靜態的技術就很好的解決了這一問題。
 要想清楚地知道僞靜態的技術,我們還是先來看看IHttpModule這個接口吧!
 IHttpModule:向實現類提供模塊化初始化和處理事件。相對於整個應用程序來講,如果我們需要在請求發生之時對請求的地址進行處理就需要用到IhttpModule接口來實現僞靜態技術,也就是將一個Get訪問的查詢字符串變成一個獨立的文件,但是呢,在程序中實際上訪問的還是查詢字符串中的值。如http://www.myweb.com/news.aspx?id=1Http://www.myweb.com/news.aspx?id=1
改變爲
http://www.myweb.com/news_1.aspx Http://www.myweb.com/news_1.aspx,這樣,在外人看來就是一個單獨的頁面,而我們在實際用的時候還是用Get方式來傳值的。
 IHttpModule接口中有兩個方法供我們實現:一個是Dispose,用來處置有實現IHttpModule的模塊使用的資源(內存除外)。一個是Init,初始化模塊,並使其爲處理請求做好準備。而我們要實現僞靜態的技術主要用的就是Init方法。
 首先,我們需要在Web.config文件中,在節點system.web元素彙總添加一個httpModules的節點,如下:
<httpModules>
<add name="HttpModule" type="WebApplication1.HttpModule"/>
</httpModules>
注意:其中type,必須爲實現了IHttpModule接口的類型的具體路徑(如果有命名空間的話,前面要帶命名空間)
 接下來,我們就需要在App_Code中新建一個HttpModule類,如果有命名空間的話,就需要與配置文件中type的命名空間一致。然後要使該類實現IHttpModule接口。上面我們說到,這個接口中有兩個方法供我們來使用。而我們要用到的就是Init方法,該方法中的HttpApplication對象context包括應用程序對象的所有方法、屬性和事件。那麼,我們就可以用這個context對象,創建一個請求的事件的委託方法。
具體代碼如下:
    void IHttpModule.Init(HttpApplication context)
    {
//創建請求事件的委託
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication http = sender as HttpApplication;//得到整個應用程序對象
        HttpContext context = http.Context;//得到請求http信息對象
        string url = context.Request.RawUrl;//得到當前的請求內容
        int start = url.LastIndexOf('/') + 1;
        url = url.Substring(start);//得到路徑中的文件名
        //Default_1.aspx
        Regex reg = new Regex(@"Main_(\d+).aspx");
        Match match = reg.Match(url);//匹配項
        if (reg.IsMatch(url))//驗證是否正確
        {
            string id = match.Groups[1].Value;
            context.RewritePath("Main.aspx?id=" + id);//重定向URL
        }
        //context.Response.Write(url);
    }
其中,我們可以使用HttpContext對象的屬性Request來獲取當前請求。在得到當前請求後,可以使用正則表達式,從請求中獲取所需的可變信息,用來重新定向到新的位置(這裏用到了正則的分組,用小括號來實現,此時,我們要取的id是第一組)。然後,調用context中重定向的方法,即RewritePath(),可以將得到的新路徑放到方法參數中。
這樣,我們就完成了僞靜態的全部實現,如果有多個頁面都需要用僞靜態這個技術來實現,那麼 可以將正則表達式聲明爲一個數組來實現,具體的在這裏就不多說了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章