淺談ASP.NET的內部機制(一)

來源:互聯網
上載者:User

                                                                 淺談ASP.NET的內部機制(一)

     前言:當一個Http請求發送給一個aspx頁面時,伺服器進行了哪些操作?又如何來解析這個請求?ASP.NET在接收請求後是怎麼啟動並執行,如怎麼編譯以及怎麼樣用託管的代碼來啟動並執行?.....理解這些問題,使我們可以更加好的開發ASP.NET。

 

系列文章連結:

淺談ASP.NET的內部機制(一)

淺談ASP.NET的內部機制(二)

淺談ASP.NET內部機制(三)

淺談ASP.NET內部機制(四)

淺談ASP.NET內部機制(五)

淺談ASP.NET內部機制(六)

淺談ASP.NET內部機制(七)

淺談ASP.NET內部機制(八) 

 

      1.當我們在瀏覽器中請求一個ASP.NET網站的某個頁面的時候,如,我們在瀏覽器中輸入"http://localhost/Demo.aspx",這個請求就被發送到了伺服器(當然了,這個網站是部署在IIS中的)。當請求到達了伺服器之後,那麼IIS就開始進行一系列的操作。注意,不是每個請求都一定會由ASP.NET來運行處理的,大家稍後就會明白為什麼。

      2.在IIS中有一個組件:http.sys,其實這個組件的作用很簡單,就是驗證請求的url,如之前的"http://localhost/Demo.aspx".如果請求的URL不符合http.sys的要求,那麼這個請求就不會被傳遞給ASP.NET的處理常式,這樣就在IIS這道門檻這些阻止了不合法的url請求,這樣ASP.NET就不用處理這個不合法的請求,就減輕了伺服器的壓力。

      下面,我們就來看看這個http.sys到底是怎麼樣處理請求的url的,當大家明白這個問題後,就可以協助我們解決很多的以前遇到的問題。
      首先請大家看看下面的圖:

     
      

     當發送一個請求來請求頁面的時候,http.sys就會檢查這個請求的url和headers的總的大小:包含檢查url中有關查詢字串的大小,如demo.aspx?username=demo,也會檢查cookie的大小。把這些所有的加起來,看看它們是否超過了16KB,如果超過了,請求就失敗了。所以請求根本就沒有傳遞給ASP.NET。

      而且在http.sys檢查url的時候也有很多的要求的。如我們之前的那個url:
      http://localhost/Demo.aspx

      這個url是由localhost,Demo.aspx,這些路徑的片段組成的,每一個由"/"分割的字串都是一個路徑片段,本例中就有兩個路徑片段。在預設情況下,http.sys要求一個url的路徑片段不超過255個,並且每個路徑片段的大小也不要超過260個字母。但是注意,如果在Demo.aspx後面有查詢字串,"Demo.aspx?page=1",那麼這個片段就可以超過260個字母的限制,即"Demo.aspx?page=1"可以更大。但是不管怎麼樣,這些url的大小,如之前所說的,不能超過16KB。如果沒有通過http.sys的要求,IIS就發送一個404的錯誤。

      之前也說了的,那是預設的這隻,其實這些設定我們是可以在註冊表中改的。但是預設設定已經很不錯了,所以一般沒有必要改。

      3.當請求的url通過了http.sys的檢查後,請求就會傳遞給aspnet_filter.dll,下面簡稱filter。
      其實這個filter做兩件事:將url中的無cookie的票據轉換為Http Headers;保護ASP.NET的相應的目錄。

      首先來看看第一個作用:檢查url中的無cookie資訊,並且轉換為Http Headers.

      大家應該明白ASP.NET2.0中的新特性-支援無cookie,即cookieless。因為我們在進行驗證的時候一般是基於Forms驗證,而這種驗證方式是把資訊儲存在cookie中的,但是有的使用者的瀏覽器是禁用了cookie的,所以為了使得我們可以繼續用這個驗證方式,就把驗證資訊儲存為無cookie,大家可以去查看有關這方面的資料。來看看下面的一個url:
      http://localhost/demo/(S(tuucni55xfzj2xqx1mnqdg55))/Default.aspx
 我們其實把有關的資訊儲存在了url中,如上面的"S"就標識在後面括弧"()"的資訊就是無cookie的資訊(tuucni55xfzj2xqx1mnqdg55).
 來看看“S”是什麼:
      S—Cookieless ticket for session state
      A—Cookieless ticket for anonymous identification
      F—Cookieless ticket for forms authentication

      其實filter並不知道這些標識(如"S")的意義.只是filter檢查url中是否包含這些標識,並且這些標識後面還有"()",如果在url中檢查到有這些標識,那麼filter就把這些標識轉換為Http Headers,並且在url中刪除這些標識。我們本來請求的是http://localhost/demo/Default.aspx頁面,但是如果filter不刪除標識,那麼我們請求的http://localhost/demo/(S(tuucni55xfzj2xqx1mnqdg55))/Default.aspx是不存在的,就會返回一個404錯誤(找不到請求的檔案)。

      現在我們來看看filter的第二個作用的:保護ASP.NET的相應的目錄。
      在我們開發的ASP.MET網站中,有很多的檔案目錄是不允許訪問的,如我們存放資料的App_Data,App_Code等。所以filter就會檢查請求的url中是否包含這樣的字元,如http://localhost/demo/App_Code/....一旦發現有這樣的字串出現,甚至是以"App_"開發的任何字串,如“App_MyFolder",這個請求就會被拒絕了。但是,假如你的項目中已經有一個這樣的以"App_"命名的目錄,如果你非要可以訪問這樣的目錄,可以在註冊表中修改設定HKEY_LOCAL_MACHINE\Software\Microsoft\ASP.NET。

 

 今天就寫到這些,下篇接著講述。

 
 

 

 

 
 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.