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

ASP.NET,抬起頭來,讓朕瞧瞧

2013-11-13 11:09:15  來源: .NET編程 

  看到這個題目你一定會很吃驚其實最初我只是想把這篇blog命名為《ASPNET掀起你的蓋頭來》但後來還是抑制不住心中的興奮之情換成了這個霸氣十足的題目是的我真的很興奮畢竟一個禮拜之前我對這些東西知之甚少我整整用了一個禮拜的時間才把這些東西的來龍去脈給理個清楚興奮之余想起了《康熙大帝》中那句抬起頭來讓朕瞧瞧的經典於是索性把題目改成了《ASPNET抬起頭來讓朕瞧瞧》

  如今的程序員其審美觀何等挑剔差異又何等巨大然ASPNET這位美女卻獨領風騷何哉?大凡我們說某某某如果是外在的美那總是經不起時間的考驗和眾人對美的差異定位而如果是內在美則時間無法洗去其氣質眾人亦無旁詞故欲知ASPNET美之何在當瞧其內在方可知曉

  我在CSDN上逛的時候無意中發現了《[翻譯]了解ASPNET底層架構doc》這篇文章看完之後一頭霧水但又似乎意猶未盡於是耐心下來對於每一處有疑點的地方慢慢琢磨查資料向我的同事也是好友qwliang請教(我的很多疑惑點正是因為有他的指導和幫助才得以得到解決謝謝他)反反復復的看了幾遍終於看懂了這篇文章見了ASPNET的美

  我本來想針對自己已經形成的理解寫一個系列但是考慮到近期時間比較緊而且最終寫出來的東西大多還是剪刀+口水的產物還不如把自己的在分析分析aspnet底層運行原理過程中搜索到的比較有價值的一些資料共享上來大家仁者見仁智者見智我在後面附帶介紹自己對這些文章的評價希望能幫助你理解分析

  在分析的過程當中充分利用Reflector是必要的因為通過它你可以看到實際的代碼(盡管不一定和源代碼一模一樣)如果說文字是有二義性的那麼代碼是沒有的通過分析代碼你可以更容易理解文字表達的內容

   另外附上我的一些個人認識

   幾個名詞解釋

  A: XX工廠(Factory)生成某個對象運用了工廠模式負責生成(生產)對象任務的對象叫做工廠工廠模式是一種構建模式通過附件你應該能夠理解

  B: CLR寄宿(Host) 不要被這個名詞嚇倒其實沒有什麼CLR寄宿實際上就是在非托管應用程序中加載CLR一個非托管應用程序(比如sql server)需要運行托管代碼(比如C#寫的存儲過程)那麼就需要在它的進程當中加載NET運行時CLR也就是說CLR要寄宿在運行sql server的進程當中

  其實從生活中來看寄宿這個詞也可以幫助你理解假如你和你的家人住在一起那我們不會說你寄宿在你家如果哪天你來了一個遠房親戚住在你家他就是寄宿在你家對於一個托管程序你用Dependency這個工具來看你會發現它的運行要依賴於MsCoreedll而對於一個非托管程序則應該不會看到這個依賴(Dependency只能看到靜態依賴關系)因為寄宿CLR一般是通過LoadLibrary來動態加載的(這個我不敢肯定但是我看了好幾個exe和dll都沒有比如wwpexeinetInfoexe等)

  關於寄宿的細節你可以參考《NET框架程序設計》(修訂版)中的節《加載net運行時》和《CLR寄宿》

  C: 應用程序域(AppDomain)應用程序域從邏輯上來說它類似於進程它是一個邏輯上的容器的概念其實也就是一個范圍的概念就好像以前的跑馬圈地圈住一塊地之後就說這是我的地域范圍從實現上來說AppDomain也是System命名空間中的一個類你可以通過Reflector看到這個類的信息你也可以參考《NET框架程序設計》(修訂版)中的《應用程序域》

  D: 容器(Container) 容器就是包含其它對象的對象

  E: 管道以前對管道的理解是兩個進程通過管道來進行通信比如在IISinetinfoexe通過命名管道將請求交給aspnet_wpexe(之所以稱為命名管道是因為給這個管道起了一個隨機的名字)現在又出來了一個http 管道(http pipeline)但是這回卻是在同一個進程(比如IIS中wwpexe)裡面這是怎麼回事?讓我們來看看管道的本質我們分析一下實際生活中的管道我們看到管道具有下面兩個特征

  a  從裡面流過的東西來看東西從管道一頭進入從另外一頭出來東西還是原來的東西

  b  管道從外部形態來看它連通了兩個不同的地方也就是說它代表著一種流向一種流程一種順序

  是的我們計算機中的術語和生活中的概念是相通的我們這裡說的HTTP管道就是指Http ModuleHttp Handler這些對象而在這些HTTP管道流過的東西是同一個對象那就是Http Context對象在Http ModuleHttp Handler這些對象中對Http Context對象的處理不過是對Http Context對象中的內容進行改變(最大的改變就是給Response對象賦上內容)但是沒有改變它的結構

   幾個容易造成誤解的概念

  A:Http Application和我們在頁面中使用的Application對象這兩者是不同的前者代表著我們整個應用程序對於我們的每個請求HttpApplicationFactory都會分配一個Http Application對象這個對象將管理著這個對請求的處理邏輯或者說它是事件調度中心你可以看到我們的Globalasax實際上就繼承了HttpApplication我們在頁面中使用的Application是一個狀態的概念它是HttpApplicationState的一個實例並且是在httpContext對象上的一個子對象

  B:NET運行時和HTTP運行時NET運行時即是CLR它的核心是MsCorEEdll後者是HTTP RunTime它是Systemweb中httpRuntime類的實例HttpRuntime負責Http Application Http Context的創建和初始化等工作這兩者是不同的

  C: Http Application Http Context Http ModuleHttp Handler

  對於每個請求都被路由到一個HttpApplication對象上HttpApplicationFactory類根據應用程序的負載為你的ASPNET應用創建一個HttpApplication對象池並為每個請求分發HttpApplication對象的引用
  這裡我再次強調HttpApplication的主要職責是作為Http管道的事件控制器httpApplication它本身對發送給應用程序的數據一無所知它只是一個通過事件來通訊的消息對象它觸發事件並通過HttpContext對象來向被調用函數傳遞消息實際的當前請求的狀態數據由HttpContext對象維護你可以用Reflector看一看HttpContext類裡面包含著RequestResponseApplicationServerSession等表示狀態的對象其實HttpContext本身也表示一種狀態它還有兩個很重要的屬性Current和Items前者用來代表自己後者是可以存儲任何對象的集合你不要小看後者它真的非常有用鑒於自己與Context曾經有過一段情史我將在以後寫篇blog詳細介紹它

  httpModule有人說是它是監視器有人說是過濾器他們都是從不同角度來看httpModule所以都是對的httpModule提供了對請求進入http Handler處理之前的預處理和經過http handler處理後的事後處理既然可以預處理當然可以實現攔截請求不交給http handler去處理實現過濾的功能從另外一個角度上來說一旦有請求到來便會初始化httpModule(httpApplication中有負責初始化httpModule的InitModules()方法)當然也就意味著httpModule監視著請求(也就是監視器的來源)畢竟它是我們能夠對請求進行處理的開始需要說明一點的是ASPNET只是為我們提供了這個能力你需要自己去添加事件代碼來實現控制比如你可以在Globalasax中的事件處理函數中添加代碼你也可以自己定義http module在附件4《aspnet framework深度歷險pdf》你可以看到具體的實例至於http Handler我們的頁面其實就是一個http Handler你可以從SystemWebUIPage類(我們所有頁面的基類)的聲明中看到它要實現IHttpHandler接口你可以翻閱《.NET程序設計技術內幕》這本書的《圖形控件》看看自己定制實現http Handler的好處

  但是我不同意在附件《aspnet framework深度歷險pdf》中所說認為請求是一個單線流式的經過Http ApplicationFactory>Http Application> Http Module > Http Handler >…從附件《[翻譯]了解ASPNET底層架構doc》的圖也可以看到所有的處理起點是在最左邊的ASPNET開始為什麼呢?實際上Http Module和Http Handler都是在Http
  Application上的整個流程是由http Application進行調度的從另外一個角度上來說http Application的大部分功能都是由Http Module來實現的這些Http Module實際上就是在http Application啟動並參與處理請求時被實例化的類你可以在webconfig中ttp Module> 看到預定義的http Module 包括會話驗證等

  最後預祝你也能抱得美人歸


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