熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 10:00:07  來源: .NET編程 

  前言當一個Http請求發送給一個aspx頁面時服務器進行了哪些操作?又如何來解析這個請求?ASPNET在接收請求後是怎麼運行的如怎麼編譯以及怎麼樣用托管的代碼來運行的?……理解這些問題使我們可以更加好的開發ASPNET

  當我們在浏覽器中請求一個ASPNET網站的某個頁面的時候我們在浏覽器中輸入x這個請求就被發送到了服務器(當然了這個網站是部署在IIS中的)當請求到達了服務器之後那麼IIS就開始進行一系列的操作注意不是每個請求都一定會由ASPNET來運行處理的大家稍後就會明白為什麼

  在IIS中有一個組件httpsys其實這個組件的作用很簡單就是驗證請求的url如之前的x如果請求的URL不符合httpsys的要求那麼這個請求就不會被傳遞給ASPNET的處理程序這樣就在IIS這道門檻這些阻止了不合法的url請求這樣ASPNET就不用處理這個不合法的請求就減輕了服務器的壓力

  下面我們就來看看這個httpsys到底是怎麼樣處理請求的url的當大家明白這個問題後就可以幫助我們解決很多的以前遇到的問題

  首先請大家看看下面的圖     
      

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

  而且在httpsys檢查url的時候也有很多的要求的如我們之前的那個url

  x

  這個url是由localhostDemoaspx這些路徑的片段組成的每一個由/分割的字符串都是一個路徑片段本例中就有兩個路徑片段在默認情況下httpsys要求一個url的路徑片段不超過並且每個路徑片段的大小也不要超過個字母但是注意如果在Demoaspx後面有查詢字符串Demoaspx?page=那麼這個片段就可以超過個字母的限制Demoaspx?page=可以更大但是不管怎麼樣這些url的大小如之前所說的不能超過KB如果沒有通過httpsys的要求IIS就發送一個的錯誤

  之前也說了的那是默認的這只其實這些設置我們是可以在注冊表中改的但是默認設置已經很不錯了所以一般沒有必要改

  當請求的url通過了httpsys的檢查後請求就會傳遞給aspnet_filterdll下面簡稱filter

  其實這個filter做兩件事將url中的無cookie的票據轉換為Http Headers保護ASPNET的相應的目錄

  首先來看看第一個作用檢查url中的無cookie信息並且轉換為Http Headers

  大家應該明白ASPNET中的新特性-支持無cookie即cookieless因為我們在進行驗證的時候一般是基於Forms驗證而這種驗證方式是把信息保存在cookie中的但是有的用戶的浏覽器是禁用了cookie的所以為了使得我們可以繼續用這個驗證方式就把驗證信息保存為無cookie大家可以去查看有關這方面的資料來看看下面的一個url

  //localhost/demo/(S(tuucnixfzjxqxmnqdg))/Defaultaspx

  我們其實把有關的信息存儲在了url中如上面的S就標識在後面括號()的信息就是無cookie的信息(tuucnixfzjxqxmnqdg

  來看看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中刪除這些標識我們本來請求的是x頁面但是如果filter不刪除標識那麼我們請求//localhost/demo/(S(tuucnixfzjxqxmnqdg))/Defaultaspx是不存在的就會返回一個錯誤(找不到請求的文件)

  現在我們來看看filter的第二個作用的保護ASPNET的相應的目錄

  在我們開發的ASPMET網站中有很多的文件目錄是不允許訪問的如我們存放數據的App_DataApp_Code等所以filter就會檢查請求的url中是否包含這樣的字符//localhost/demo/App_Code/…一旦發現有這樣的字符串出現甚至是以App_開發的任何字符串App_MyFolder這個請求就會被拒絕了但是假如你的項目中已經有一個這樣的以App_命名的目錄如果你非要可以訪問這樣的目錄可以在注冊表中修改設置HKEY_LOCAL_MACHINE\Software\Microsoft\ASPNET

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


From:http://tw.wingwit.com/Article/program/net/201311/12257.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.