国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET Framework深度歷險(2)

2024-07-10 12:58:33
字體:
供稿:網(wǎng)友
  • 本文來源于網(wǎng)頁設(shè)計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  • asp.net framework深度歷險(2)

    author:uestc95
    articletype:原創(chuàng)
    e-mail:[email protected]
    .net framework version:1.0.3705正式版
    vs.net(c#) version:7.0.9466正式版


        剛剛吃完晚飯,正好在鍵盤上面鍛煉一下手指。
        接著上回繼續(xù)寫這個“日記”:
        
        chapter two -- httpmodule是如何工作的?

        我們上回說到,一個來自于客戶端的http request被截獲后經(jīng)過層層轉(zhuǎn)交(怎么都在踢皮球?呵呵)到達了httpmodule這個“請求監(jiān)聽器”。
    httpmodule就類似于安插在aspnet_wp.exe進程中的一個竊聽器,稍微有些常識的人都會很自然的想象得到竊聽器是用來做什么的,而我們的httpmodule
    可以說是作竊聽器的絕好人選了,但是需要明確的是,httpmodule絕對不是簡單的監(jiān)聽器,它可以做到更多的東西,比如它可以對截獲的請求增加一些內(nèi)容
    等等。
         另外需要明白的是,當(dāng)一個http request到達httpmodule的時候,整個asp.net framework系統(tǒng)還并沒有對這個請求做任何的真正處理,但是我們可以
    在這個http request傳遞到真正的請求處理中心(httphandler)之前附加一些我們需要的信息在這個http request至上,或者針對我們截獲的這個http
    request信息作一些額外的工作,或者在某些情況下干脆終止?jié)M足一些條件的http request,從而可以起到一個filter過濾器的作用,而不僅僅是一個竊聽器了。
         通過查閱msdn(不要去相信.net sdk自帶的那個quickstarts web文檔,正式版本中竟然在很多地方?jīng)]有更新這個文檔,很多東西在正式版本是無效的),
    你會發(fā)現(xiàn)系統(tǒng)httpmodule實現(xiàn)了一個叫做ihttpmodule的接口,很自然的就應(yīng)當(dāng)想到,只要我們自己的類能夠?qū)崿F(xiàn)ihttpmodule接口,不就可以完全替代系統(tǒng)的
    httpmodule了嗎?完全正確。
         在我們開始自己的httpmodule類之前,我先來告訴你系統(tǒng)中的那個httpmodule是什么樣子的,asp.net系統(tǒng)中默認的httpmodule有以下幾個:
                system.web.caching.outputcachemodule
                system.web.sessionstate.sessionstatemodule
                system.web.security.windowsauthenticationmodule
                system.web.security.formsauthenticationmodule
                system.web.security.passportauthenticationmodule
                system.web.security.urlauthorizationmodule
                system.web.security.fileauthorizationmodule
         
         好了,我們來開始我們自己的httpmodule構(gòu)建歷程吧。
         1)打開vs.net新建一個“class library”項目,將它命名為myhttpmodule。
         2)引用system.web.dll文件

         在代碼區(qū)域敲入:

    using system;
    using system.web;

    namespace myhttpmoduletest
    {
        /// <summary>
        /// 說明:用來實現(xiàn)自定義httpmodule的類
        /// 作者:uestc95
        /// 聯(lián)系:[email protected]
        /// </summary>
        public class myhttpmodule:ihttpmodule
        {
            /// <summary>
            /// 說明:構(gòu)造器方法
            /// 作者:uestc95
            /// 聯(lián)系:[email protected]
            /// </summary>
            public myhttpmodule()
            {
                
            }

            /// <summary>
            /// 說明:實現(xiàn)ihttpmodule接口的init方法
            /// 作者:uestc95
            /// 聯(lián)系:[email protected]
            /// </summary>
            /// <param name="application">httpapplication類型的參數(shù)</param>
            public void init(httpapplication application)
            {
                application.beginrequest +=new eventhandler(this.application_beginrequest);
                application.endrequest +=new eventhandler(this.application_endrequest);
            }

            /// <summary>
            /// 說明:自己定義的用來做點事情的私有方法
            /// 作者:uestc95
            /// 聯(lián)系:[email protected]
            /// </summary>
            /// <param name="obj">傳遞進來的對象參數(shù)</param>
            /// <param name="e">事件參數(shù)</param>
            private void application_beginrequest(object obj,eventargs e)
            {
                httpapplication application=(httpapplication)obj;
                httpcontext context=application.context;
                httpresponse response=context.response;
                httprequest request=context.request;

                response.write("我來自application_beginrequest,:)");
                
            }

            /// <summary>
            /// 說明:自己定義的用來做點事情的私有方法
            /// 作者:uestc95
            /// 聯(lián)系:[email protected]
            /// </summary>
            /// <param name="obj">傳遞進來的對象參數(shù)</param>
            /// <param name="e">事件參數(shù)</param>
            private void application_endrequest(object obj,eventargs e)
            {
                httpapplication application=(httpapplication)obj;
                httpcontext context=application.context;
                httpresponse response=context.response;
                httprequest request=context.request;

                response.write("我來自application_endrequest,:)");
                
            }

            /// <summary>
            /// 說明:實現(xiàn)ihttpmodule接口的dispose方法
            /// 作者:uestc95
            /// 聯(lián)系:[email protected]
            /// </summary>
            public void dispose(){}
        }
    }

         3)在vs.net中編譯之后,你會得到myhttpmodule.dll這個文件。
         4)接下來我們的工作就是如何讓aspnet_wp.exe進程將http request交給我們自己寫的這個httpmodule呢?方法就是配置web.config文件。
         在web.config文件中增加如下幾句話:
            <httpmodules>
                <add name="test" type="myhttpmoduletest.myhttpmodule,myhttpmodule"/>
            </httpmodules>
          注意要區(qū)分大小寫,因為web.config作為一個xml文件是大小寫敏感的。“type=myhttpmoduletest.myhttpmodule,myhttpmodule”告訴我們
          系統(tǒng)將會將http request請求交給位于myhttpmodule.dll文件中的myhttpmoduletest.myhttpmodule類去處理。而這個dll文件系統(tǒng)將會自動
          到/bin子目錄或者系統(tǒng)全局程序集緩沖區(qū)(gac)搜尋。我們可以將我們剛才得到的dll文件放在bin子目錄中,至于后者,你可以通過.net sdk正式版
          自帶的config工具做到,我們不詳細說了。


          好了,我們的用來截獲http request請求的httpmodule就完成并且裝配完成了,你可以試著在你的web項目中建立一個新的webform,運行看看呢?:)
          最后,我們假設(shè)一個使用這個httpmodule的場合。a站點提供免費的asp.net虛擬空間給大家,但是a站點的管理者并不想提供免費的午餐,他想要在每一個
          頁面被瀏覽的時候自動彈出自己公司的廣告(就像現(xiàn)在的www.x63.com一樣),我總不能時刻監(jiān)視所有用戶的所有頁面吧,并且想要在每一個頁面手動添加
          一段js代碼,工作量是不可想象的,也是不現(xiàn)實的。那末好了,只要我們的httpmodule一旦被掛接完成,這一切都將是輕而易舉的事情了,只要我們在每一個
          http request被我們捕獲的時候,給他增加上一些js就好了!

          我們上面提到在init()方法中使用了兩個事件beginrequest和endrequest,這兩個事件分別是init()中可以處理的所有事件的最開始事件和最終事件,在他們
          中間還有一些其它的事件可以被我們利用,可以查閱msdn。

          另外在我關(guān)閉editplus之前,需要敲下如下的話:
          在httpmodule中可以正常使用response,request,server,application,但是不能操作任何與session有關(guān)代碼!
          為什么呢?自己考慮一下吧,下回看看原因在哪里,另外再給出一個問題,你能發(fā)現(xiàn)系統(tǒng)默認的那幾個httpmodule在哪里配置的呢?找找看。
          
          下回我們看看httphandler部分以及如何同httpmodule相配合的東東。

          see you later.

          (待續(xù),歡迎探討:[email protected])

    發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 稷山县| 阿拉尔市| 苏尼特右旗| 洪江市| 甘泉县| 行唐县| 绵竹市| 西乌珠穆沁旗| 松潘县| 牙克石市| 瓮安县| 庄河市| 杭锦后旗| 昔阳县| 佳木斯市| 大港区| 进贤县| 孟村| 新竹县| 泊头市| 石河子市| 昂仁县| 青龙| 永泰县| 杂多县| 农安县| 商河县| 水富县| 富平县| 富民县| 鄯善县| 扎赉特旗| 东山县| 三穗县| 鄂托克旗| 浦东新区| 东光县| 宝兴县| 弋阳县| 黄骅市| 罗甸县|