跳至內容

ASP.NET

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 09:40 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

ASP . NET是由微軟仔佇咧 . NET Framework 框架中所提供,開發 Web 應用程式的類別庫,封裝佇 ` System . Web . dll ` 檔案中,顯露出 ` System . Web ` 號名空間,並提供 ASP . NET 網頁處理、擴充佮 HTTP 通道的應用程式佮通訊處理等工課,以及 Web Service 的基礎架構。ASP . NET 是 ASP 技術的後繼者,但是伊的發展性愛比 ASP 技術欲大足濟。

ASP . NET 會當鬥陣佇安裝矣 . NET Framework 的 IIS 侍服器上,若欲佇非微軟的平台頂執行,著愛使用 Mono 平台,ASP . NET 佇二鋪空版本已經定型,佇咧 . NET Framework 三鋪五上是加上誠濟功能,像講 ASP . NET AJAX、ASP . NET MVC Framework、ASP . NET Dynamic Data 佮 Microsoft Silverlight 的侍服器控制項等。

足濟人攏共 ASP . NET 當做是一種程式的語言,但是伊實際上只是一个由 . NET Framework 提供的一種開發平台 ( development platform ),並毋是程式語言。嘛會當認為講 ASP . NET 是 . NET 組件,任何 . NET 語言,比如講 C #,會當參照這个組件,建立網頁抑是 Web 服務。

為著雲端化所誘發的濟作業平台整合佮開發能力,微軟特別開發一个新一代的 ASP . NET,這號做 ASP . NET vNext,並且二空一四年號名 ASP . NET 五,毋過因為二空一六年就共伊閣較號做 ASP . NET Core,因為架構頂的差異誠大,因此未來 ASP . NET 佮 ASP . NET Core 分別的發展佮維護,Windows 平台的 ASP . NET 四配六以上版本猶原維持 Windows Only,猶毋過 ASP . NET Core 是有跨平台 ( Windows , Mac OSX 佮 Linux ) 的能力。

發展因緣

ASP . NET 較早是身 ASP 技術,是佇咧 IIS 二孵空頂頭一改推出(Windows NT 三孵五一), 彼當陣佮 ADO 做伙推出,佇咧 IIS 三-c零(Windows NT 四配零)推捒出去,成為侍服器捀應用程式的熱門開發工具,微軟閣特別為伊量身打造矣 Visual InterDev 開發工具,佇一九九四年到二空空年之間,ASP 技術已經成做是微軟推展 Windows NT 四配零平台的關鍵技術之一,數以萬計的 ASP 網站嘛是這个時陣開始的如雨後春筍般的出現佇網路頂懸。因為伊的簡單佮懸度客制化的能力,嘛是伊會當快速衝起來的原因之一。

猶毋過 ASP 的缺點嘛沓沓仔浮出來:

  • 義大利麵型的程式開發方法,予伊維護的難度提懸真濟,尤其是大型的 ASP 應用程式。
  • 直譯式的 VBScript 抑是 JScript 語言,予效能淡薄仔受限。
  • 延展性因為其基礎架構擴充性不足受限,雖然講有 COM 元件可用,但開發一寡特殊的功能(像檔案傳)時,無來自內起的支援,需要尋求第三方軟體商開發的元件。

一九九七年的時,微軟仔開始針對 ASP 的缺點(尤其是義大利麵型的程式開發方法)準備開始了一个新的專案來開發,彼當陣 ASP . NET 的主要領導人斯科特 ・ 格思里拄仔對杜克大學畢業,伊和 IIS 團隊的 Mark Anders 經理做伙合作兩個月,開發出了後一代 ASP 技術的原型,這个原型佇一九九七年的聖誕節的時陣予人發展出來,並予一个名稱:XSP,這个原型產品使用的是 Java 語言。毋過伊連鞭就予人納入彼陣猶閣咧開發中的 CLR 平台,Scott Guthrie 事後嘛認為講將這个技術徙栽到彼當陣的 CLR 平台,確實有足大的風險(huge risk), 但是彼陣的 XSP 團隊煞是用 CLR 開發應用的第一个團隊。

為著欲 XSP 徙栽到 CLR 中,XSP 團隊共 XSP 的核心程式全部以 C # 語言重新編寫(佇內底的專案代號是 " Project Cool ",毋過彼陣對公開場合是保密的), 並且改名做ASP +,做為 ASP 技術的後繼者,並且嘛會提供一个簡單的移轉方法予 ASP 開發人員。ASP + 頭擺的 Beta 版本以及應用佇咧 PDC 兩千中留相,由 Bill Gates 發表 Keynote(即關鍵技術的概覽), 由富士通公司展示使用 COBOL 語言編寫 ASP + 應用程式,並且宣布伊會使用 Visual Basic . NET、C #、Perl 佮 Python 語言(後兩項由 ActiveState 公司開發的互通工具支援)來開發。

佇二空空年第二季的時陣,軟軟正式推動 . NET 策略,ASP + 嘛順這个勢章的改名做ASP . NET,經過四年的開發,頭一个版本的 ASP . NET 佇二空空二年一月五號娘相(和 . NET Framework 一垺零), Scott Guthrie 嘛成做 ASP . NET 的產品經理(到這陣已經開發數一下微軟仔產品,像 ASP . NET AJAX 和 Microsoft Silverlight)。

ASP . NET 處理架構

ASP . NET 運行的架構分做幾个階段:

  • 佇咧 IIS 佮 Web 侍服器內底的訊息流動階段。
  • 佇咧 ASP . NET 網頁中的訊息分派。
  • 佇咧 ASP . NET 網頁內底的訊息處理。

Web 侍服器的訊息佇咧流動的階段

當做裝載 ( hosting ) ASP . NET 的 Web 侍服器接收著 HTTP 請求的時陣,HTTP 聆聽程式 ( HTTP Listener,實際上是核心態的 HTTP . SYS ) 會將請求轉交予 URL 指定的網站應用程式池中的工作者處理程序 ( Worker Process ),ASP . NET 的工作者處理程序接收著這个請求了後,裝載專用於處理 ASP . NET 頁面的一个 ISAPI 擴充「aspnet \ _ isapi . dll」,並將 HTTP 請求傳予伊。若是 IIS 五曉空時是 aspnet \ _ wp . exe。

aspnet \ _ isapi . dll 負責載入 ASP . NET 應用程式的執行環境 CLR(IIS 七整合模式下,CLR 是預載入的), 彼每一个 ASP . NET 應用程式攏執行佇家己應用程式域(AppDomain)中。每一个應用程式域攏對應的一个 ApplicationManager 類別的實例(通過 AppManagerAppDomainFactory 建立), 負責管理執行在域中的 ASP . NET 應用程式(啟動佮停止一个 ASP . NET 應用程式、建立物件等等)。 ApplicationManager 閣建立一个 HostingEnvironment 東西,提供矣 ASP . NET 應用程式的一寡管理資訊(如 ASP . NET 應用程式的標識、虛擬 kha-tá-lok-guh 佮對應的物理 kha-tá-lok-guh 等)。

應用程式域建立完成了後,建立 System . Web . Hosting 號名空間中的對 ISAPIRuntime 的一个物件,呼叫其 ProcessRequest ( ) 方法。在此方法內底,根據傳入的 HTTP 請求資訊封鎖了版本差異化了後封裝實例化了一个 HttpWorkerRequest 的物件而且初初化一个 HttpRuntime 東西。搧叫 HttpRuntime 的 ProcessRequestInternal 方法。ProcessRequestInternal 方法實例化一个 HttpContext 東西(其建構函式內部閣實例化矣佇咧 ASP . NET 編程當中足重要的 HttpRequest 和 HttpResponse 東西)、 通過 HttpApplicationFactory 取得 HttpApplication 東西實例。才呼叫 HttpApplication 物件的 BeginProcessRequest 方法啟動規个 HTTP 請求的處理過程(即HTTP 管線模式)。

System . Web . UI . Page 類似提供了「Requset」和「Response」內容來參照這兩个物件,所以佇遮 ASP . NET 網頁會當直接存取這兩个物件。仝款,System . Web . UI . Page 類的 Context 內容參照 HttpContext 東西。

HttpRuntime 類的 ProcessRequest ( ) 方法除了建立 HttpContext 東西以外,閣完成另外一个足重要的工課—— 向 HttpApplicationFactory 類的一个實例(伊管理一个 HttpApplication 東西池)申請分配一个 HttpApplication 物件用佇咧管理規个「HTTP 請求處理的管線(HTTP Pipeline)」 著的各種事件的激發。佇咧 HttpApplication 物件的 InitModules ( ) 方法內底共建立 HTTP 模組(HTTP Module), 通常佇咧 HTTP 模組物件(實現 IHttpModule 介面)的 Init ( ) 方法內底回應 HttpApplication 物件所激發的特定事件。開發者會當建立是因為 IHttpHandler 介面的東西,佇咧 Web . Config 插入去特定的內容會當共自訂的 HTTP 模組加入到 HTTP 請求的處理流程內底。佇咧 IIS 六和 IIS 七經典模式下,是用 Event + 事件名稱做 key 共所有的事件囥佇內底 HttpApplication 的 Events 內容物件里,然後佇 BuildSteps 里統一按照順序組織。佇咧 IIS 七整合模式下,是通過 HttpModule 名稱 + RequestNotification 列舉值作為 key 共所有的事件囥佇內底 HttpApplication 的 ModuleContainers 內容物件里,這个內容的類型是 PipelineModuleStepContainer [ ]。

「 HTTP 請求處理的管線(HTTP Pipeline)」 的處理過程為:

一 . 預處理階段:由濟个 HTTP 模組參與,通過事件來驅動,主要是著 HttpContext 物件的各種內容進行修改。 二 . 處理階段:由 System . Web . UI . Page 類接手 HttpContext 東西。Page 類實現矣 IHttpHandler 介面,所以有 ProcessRequest ( ) 方法並予自動呼叫。ProcessRequest ( ) 方法的執行結果閣重整理咧 HttpContext 物件的內容。 三 . 了後處理階段:HttpApplication 物件繼續激發了後的事件。若有特定的 HTTP 模組回應遮的事件,𪜶會去予自動叫做。咧管線尾溜,資訊傳轉來到 ISAPIRuntime,以及 aspnet \ _ isapi . dll,最後交由 HTTP Listener 回傳予使用者捀。當 HTTP 請求處理煞,相關的物件予人釋放,但是建立的應用程式域,以及 HttpApplication 等物件猶閣活咧,以回應後一擺 HTTP 請求。

具體的處理管線:

一 . BeginRequest : 開始處理請求。當 ASP . NET 執行的時接收著新的 HTTP 請求的時陣引發這个事件二 . AuthenticateRequest 授權驗證的請求,取得使用者授權資訊。當 ASP . NET 執行的時準備驗證使用者身份的時陣引發這个事件三 . PostAuthenticateRequest:驗證身份成功。通過 HttpContext . User 提會四 . AunthorizeRequest 使用者權限授權。當 ASP . NET 執行的時準備授權使用者存取資源的時陣引發這个事件五 . PostAuthorizeRequest : 得著授權六 . ResolveRequestCache : 提予頁面緊號結果,若準有咧直接倒轉結果七 . PostResolveRequestCache 緊取檢查結束八 . MapRequestHandler:IIS 七整合模式才支援九 . 走揣並建立 HttpHandler:根據 URL 路徑抑是副檔名佮匹配規則走揣建立,才值予 HttpContext . Handler 內容(干焦限於 IIS 六佮 IIS 七經典模式) 十 . PostMapRequestHandler 成功建立 IHttpHanlder 物件十一 . AcquireRequestState 取得請求狀態,一般用的取得 Session:先來判斷做頭前頁面的物件敢有實現 IRequiresSessionState 介面,若實現矣,是對瀏覽器發來的請求報文體內得著 SessionID , 併著侍服器的 Session 池中得著對應的 Session 東西,到尾仔一直值予 HttpContext 的 Session 內容十二 . PostAcquireRequestState 成功得著 Session 十三 . PreRequestHandlerExecute : 準備執行 HttpHandler 處理程式。 十四 . 執行 HttpHandler 處理程式(干焦限於 IIS 六佮 IIS 七經典模式): 搧叫 HttpHandler 的 ProcessRequest 方法(仝步)抑是 BeginProcessRequest 方法(非同步)。 十五 . PostRequestHandlerExecute 執行 HttpHandler 處理程式結束。 十六 . ReleaseRequestState 準備釋放請求狀態(Session) 十七 . PostReleaseRequestState 成功釋放請求狀態(Session) 十八 . Filter:共內容寫入去 Filter(干焦限於 IIS 六佮 IIS 七經典模式) 十九 . UpdateRequestCache 更新緊取二十 . Filter:共內容寫入去 Filter(干焦限於 IIS 七整合模式) 二十一 . PostUpdateRequestCache 已經更新緊取二十二 . LogRequest 為當前請求執行紀錄檔記錄(干焦限於 IIS 七整合模式) 二十三 . PostLogRequest 已經完成紀錄檔(干焦限於 IIS 七整合模式) 二十四 . EndRequest 完成。共回應內容傳送到客戶捀進前引發這个事件。 二十五 . Noop:擴充使用(干焦限於 IIS 六佮 IIS 七經典模式) 二十六 . PreSendRequestHeaders:根據傳送的 Headers 動態設定一寡參數(干焦限於 IIS 七整合模式) 二十七 . PreSendRequestContent:會使對輸出內容做壓縮(干焦限於 IIS 七整合模式)

佇咧 ASP . NET 內部的 HTTP 處理器有:

  • ISAPIRuntime:由 aspnet \ _ isapi . dll 搧叫,初初化 HttpWorkerRequest 東西(會由 IIS 的版本決定欲初化的版本)。
  • HttpRuntime:提供請求在列 ( Request Queue )、搧叫 HttpWorkerRequest 中的 ProcessRequest ( ) 方法,猶閣有後壁的處理工課。
  • HttpWorkerRequest:產生 HttpApplication、HttpRequest、HttpResponse 等基礎物件的 HTTP 請求物件,並共要求轉送到愛處理的物件(並呼叫伊的 ProcessRequest ( ) 方法)。
  • IHttpHandler 佮 IHttpAsyncHandler:負責處理 HTTP 請求的單元,由 ProcessRequest ( ) 來分派佮執行請求。

ASP . NET 網頁內底的事件

當 HttpWorkerRequest 搧叫ASP . NET 網頁(System . Web . UI 號名空間的 Page 類別)的 Page . ProcessRequest ( ) 方法的時陣,伊會照起工來的引發 Page 內底的每一个事件,並同時呼叫佇咧 Page 中所有控制項的相關事件,其引起順序為:

啟動的階段:設定頁面基本的內容,如 Request 和 Response。在此階段,頁面猶將確定請求是回發請求抑是新請求,並設定 IsPostBack 內容。

一 . PreInit 事件:執行預先初始化的工課,佇咧 ASP . NET 二孵空中,若欲動態調整主版頁面 ( Master Page )、佈景主題 ( Theme ) 時,愛佇這个事件去調整。設定頁面一寡上基本的特性,如載入個人化資訊佮主題、執行的時 Culture。 二 . Init 事件:欲執行初始化工作。根據頁面的侍服器標籤佮其內容設定,生做各个侍服器控制項的實例佮予遮的侍服器控制項的實例的內容進行賦值,閣存入去 ViewState,但是因為本階段的價值行為優先於 ViewState 的 TrackViewState 被呼叫,所以遮的視圖的值攏將袂存入最終呈現的視圖狀態隱藏欄位中。 三 . InitCompleted 事件:佇完成初始化工作了引發。搧叫 ViewState 的 TrackViewState 方法,開啟對視圖狀態更改的跟蹤。 四 . Preload 事件:載入表單傳值)。 頁面法呼叫 LoadViewState、LoadControlState、ProcessPostData,侍服器控制項對應呼叫 LoadViewState 佮實現 IPostBackDataHandler 介面的 LoadPostData 方法五 . Load 事件:執行載入來的工課,大多數的網頁攏有 Page \ _ Load 事件處理常式,使用者控制項 ( user control ) 中嘛有 Page \ _ Load 事件定式,攏會佇現此時呼叫。


控制項的 PostBack 變更通知:做網頁偵測著是 PostBack 要求的時間,會引發 PostBack 訊息通知的事件。


控制項的 PostBack 相關事件:做網頁偵測著是 PostBack 要求的時間,會引發 PostBack 訊息指定控制項的事件。

六 . LoadCompleted 事件:執行載入來完成後的工課。 七 . PreRender 事件:共處理佇產生 HTML 結果進前的工課。 八 . SaveStateCompleted 事件:處理頁面的狀態(ViewState 佮 ControlState)儉好勢了的事件。 九 . Render 事件:來處理產生 HTML 的工課。 十 . Unload 事件:處理結束網頁的處理時的工課。

若是 HttpWorkerRequest 呼叫的是實作 IHttpHandler 介面的HTTP 處理常式時,伊干焦會呼叫 IHttpHandler . ProcessRequest ( ) 方法,由伊來處理程式的輸出,無成 Page . ProcessRequest ( ) 會處理事件順序,所以 HTTP Handler 足適合輕量級的資料處理,袂輸是挵破檔案資料流抑是圖片的資料流等。

ASP . NET 的事件模型

ASP . NET 的原始設計構想,就是欲予開發人員會當像 VB 開發伊的家私頭仔按呢,會使用事件驅動式程式開發模式 ( Event-Driven Programming Model ) 的方法來開發網頁佮應用程式,若欲以 ASP 技術來做著這件代誌,就必須愛使用大量的輔助資訊,親像查詢字串抑是表單欄位資料來識別佮判斷物件的來源、事件流向以及呼叫的函式等等,需要編寫的程式碼量不止仔濟,猶毋過 ASP . NET 真奇巧利用表單欄位佮 JavaScript 指令碼共事件的傳達模型隱藏起來矣。

ASP . NET 的事件模型是由著 ` < form runat=" server " > < / form > ` 以及數個 Hidden Field 組合來成,是因為 HTTP 模型的限制,所有的網頁程式佇執行結果輸出到使用者捀後,程式就會結束執行,為著欲維護 ASP . NET 網頁佮控制項的狀態資料,就按呢佇輸出 ASP . NET 節項的時陣,ASP . NET 會共部份的資料儲存佇網頁的 Hidden Field 中,這款的狀態資料號做ViewState(ID 為 ` _ _ VIEWSTATE `), 咧侍服器捀就會予人解譯出狀態佮事件資料。佇大多數的內建 Web 控制項內底攏有用著這个機制,所以咧使用大量 ASP . NET Web 控制項的網頁內底,就是會有真濟的 ViewState 會囥佇咧網頁內底並且 HTTP 資料流輸出到使用者捀,ViewState 咧輸出的時陣,會予人摻甲密密做一組亂碼字攕,其金鎖值定義佇咧電腦內底,並且每一个物件攏會予人序列化 ( serialize ) 貫成字貫(因此若是家己訂做的物件愛囥咧 ViewState 時,著愛予伊支援序列化), 才輸出到 ` _ _ VIEWSTATE ` 欄位內底,佇逐擺的網頁來回的時攏會予傳輸,較大的 ViewState 會予網頁大細膨脹,不利佇快速的網路傳輸,猶毋過 ASP . NET 本身有提供將 ViewState 關起來的功能,因此若控制項毋免狀態儲存的時陣,會當共關起來以減少輸出的大細。

為著確保控制項的事件會當確實被引發,予事件驅動會當予人執行,因此控制項事件引發命令的時陣需要參數,交予 JavaScript 指令碼佇使用者捀引發的時陣,坉落去另外一个 Hidden Field(ID 為 ` _ _ EVENTTARGET ` 以及 ` _ _ EVENTARGUMENT `), 並且引發表單的送出指示 ( submit ),傳送到侍服端了後,侍服捀的 HttpApplication 中的工具函式會去解破 ` _ _ EVENTTARGET ` 和 ` _ _ EVENTARGUMENT ` 欄位中的資訊,而且交予控制項所實際的 RaisePostBackEvent ( ) 來引發事件,並由 . NET Framework 內底的事件處理機制接手處理(呼叫控制項設定的事件處理常式)。

ASP . NET 的來回模式

佇咧 ASP . NET 咧走的時陣,經常會有網頁的來回動作 ( round-trip ),佇咧 ASP . NET 中稱做PostBack,佇傳統的 ASP 技術上,判斷網頁的來回是需要由開發人員家己編寫,到位矣 ASP . NET 時,開發人員會使用 Page . IsPostBack 機能來判斷敢是為第一擺執行(當 ASP . NET 發現 HTTP POST 要求的資料是空值的時陣), 伊會當保證 ASP . NET 的控制項事件干焦會執行一擺,但是伊有缺點(是因為 HTTP POST 本身伊的缺陷), 就是若用者使用瀏覽器的重新整理功能(揤 F 五抑是重新整理的開關)重新整理網頁的時陣,上尾一擺執行的事件會閣被執行一擺,若欲避免這个狀況,必須愛強迫瀏覽器清空緊取才會當。

ASP . NET 二鋪空中有新增三个來回模式:

  • Cross Page Postback:允准跨無仝的網頁執行 PostBack,侍服捀會使用 Page . IsCrossPostBack 來判斷敢是跨網頁型的來回。
  • Async Page Mode:允准網頁使用非同步的方式執行,侍服捀會使得 Page . IsAsync 來判斷。
  • Callback:ASP . NET 二嬸空新增加的由網頁回呼使用者捀指令的功能,侍服捀會使得 Page . IsCallback 來判斷是毋是要求是來自 Callback。

來回模式毋但是 ASP . NET 運作時的核心,伊嘛是 ASP . NET 應用程式的一个主要的缺點,尤其是咧設計複雜度懸的頁面的時陣,佇咧網頁當中隱藏的 ViewState 的大細會誠大,啊若佇逐改的來回動作中,伊攏會傳送 ViewState 在內的表單資訊,大量的 ViewState 可以傳送的時間拉長,而且逐擺來回動作攏會予規个網頁予整理,煞出現閃爍的狀況(就算講佇本機捀嘛仝款), 猶毋過佇 AJAX 技術猶未成熟的時陣,干焦會當忍受這種因底層限制所帶來的問題,佇咧 ASP . NET AJAX 技術發展出來了後,透過UpdatePanel成功的緩解了這个問題(猶毋過 ViewState 傳送的問題猶原無根本的解決,必須愛使用像 Page Method 這款的方式才會當徹底的解決)。

繪製技術

熟似 ASP 技術的人攏知影,程式碼攏是濫佇咧 HTML 標籤之間,以輸出預期需要的 HTML 指令,這技術佇咧 ASP . NET 中,由各控制項的畫製( Render ) 機制共包裝起來矣,畫機制裝載矣 HtmlTextWriter 東西,由伊來產生 HTML 指令,伊會輸出至 HttpContext 的 Response 輸出資料流中(即 ASP 技術的 Response . Write ( )), 下列程式碼做繪製技術的範例:

為著欲予控制項的輸出有階層性,ASP . NET 開發一个會當階層化輸出控制項 HTML 指令的方式,這號做控制項樹 ( Control Tree ),才藉著控制項樹仔,會當予每一个控制項的輸出會當階層化,無論是毋是收納型控制項,猶是一般型的控制項,攏會當按照控制項的順序來輸出。

狀態管理

狀態管理 ( state management ) 佇咧 Web 應用程式內底,一向是足重要的課題,真好的狀態管理會當幫助開發人員發展出具有狀態繼續能力的應用程式(親像工作流程型應用程式抑是電子商務應用程式), 毋過狀態管理功能會看著應用程式的部署狀態佮資訊的共享程度來選擇,佇咧 ASP . NET 中,分做侍服器捀狀態管理佮使用者捀狀態管理,使用者捀狀態管理做ViewState以及 Cookies,侍服捀狀態管理是SessionApplication東西。𪜶的差異點佇咧講:

  • ViewState 是加密的資料流,和 HTML 做伙輸出到使用者捀。
  • Cookies 是加密(嘛會用得加密)的小型資料,和 HTML 無仝,伊會使緊取佇使用者捀瀏覽器內底。
  • Session 是侍服器捀的狀態儲存機制,逐个使用者捀起有獨立的空間(以瀏覽器執行個體來賦佮唯一的 SessionID 值)。
  • Application 是侍服器捀的狀態儲存機制,猶毋過應用程式所有的使用者捀做伙來做仝一份狀態資料。

應用程式層級物件

Application 物件會佇應用程式的 Application \ _ OnStart 事件當初初,並使用名稱來識別資料(伊是一个 NameObjectCollectionBase 集合的實作品), 伊會儲存佇咧應用程式的範圍內底,所有的連線(使用者)攏會使用,屬於共享型的儲存體,適合儲存所有使用者攏會使用的資料,佇濟人使用的情形下,會當適當的使用 Lock / Unlock 的機制來確保應用程式狀態的更新。

連線層級物件

連線層級的物件是 Session,以瀏覽器的執行個體為識別單位,資料依瀏覽器的執行個體來儉,佇瀏覽器的執行個體第一改連著應用程式的時,ASP . NET 會設定一个 Session ID,並且使用伊來識別 Session,彼每一个 Session 攏是 ICollection 佮 IEnumerate 的實作,用 key 來識別資料值,並且有時間的限制 ( timeout ),若超過時間侍服器會自動清理掉,預設的 Session 時限時間二十分鐘。Session ID 算法是由 RNGCryptoServiceProvider(密碼編譯亂數產生器提供者)產生,並編碼做一个 Session ID 字捾(比如講 anf 四 vuup 三 xiq 零 arjlqla 二 l 五十五按呢的字捾)儲存咧侍服器內底,用別項的 Session 個體。

為著無仝款的使用者捀,ASP . NET 有設計無仝的 Session ID 囥入去機制,親像舊式的瀏覽器抑是行動用戶端這種無支援本機儲存 cookie 的裝置的時陣,ASP . NET 會當直接佇 URL 加上中 Session ID 的識別,像講 ` http : / / www . example . org / ( anf 四 vuup 三 xiq 零 arjlqla 二 l 五十五 ) / profile . aspx ` 按怎 URL,會使由開發人員家己設定,抑是使用 AutoDetect 設定來予 ASP . NET 家己判斷欲使用的 Session ID 囥入去方式。

Session ID 的產生方法會當由程式開發人員自訂,藉由覆寫 SessionIDManager 的 CreateSessionID ( ) 方法來自訂。

跨機器狀態管理

狀態管理佇咧單一侍服器頂懸,會當儲存佇咧侍服器的記持體內底,你若講佇大間的網站內底,使用真濟 Web 侍服器來實行負載平衡(Load Balancing)處理的時,會有狀態儲存佇咧佗位的問題,因此需要有一个會當佇逐个 Web 侍服器之間做的情形儲存的媒介,親像獨立的侍服器抑是資料庫等等。佇咧 ASP . NET 中支援了四種狀態儲存的媒介:

  • InProc:儲存佮 ASP . NET 相仝的執行程當中 ( in-procedure state ),適合單一侍服器的狀態儲存。
  • StateServer:儉佇咧 ASP . NET 狀態侍服器 ( state server ) 中,適合跨侍服器的狀態儲存,但因為伊使用的通訊埠,所以佇咧使用的時陣需要注意防火牆的問題。
  • SQLServer:儉佇咧獨立的 SQL Server 資料庫內底,適合跨侍服器的狀態儲存。
  • Custom:以家己實作的狀態提供者 ( state provider )。

部件

ASP . NET 是開發 Web 應用程式的基礎架構 ( framework ),除了伊內部的運作方法以外,對外嘛顯露了真濟的開發支援,予開發人員會當利用伊來發展出真濟強大的 Web 應用程式解決方案。

基礎部件

網頁

ASP . NET 上蓋基礎的底層做網頁 ( Page ),網頁由 ` System . Web . UI . Page ` 類別來提供基礎支援,包含著頁面的事件猶閣有物件畫的引發點(Page 類別本身是一个 HTTP Handler 的實作品)。 ASP . NET 網頁佇咧微軟的官方名稱中間,這號做Web Form,除了是愛和 Windows Forms 作分別以外,同時嘛知影講伊的刻出了伊的主要功能:「 予開發人員會當像開發 Windows Forms 仝款的方法來發展 Web 網頁」。 所以 ASP . NET Page 所欲提供的功能就需要類似 Windows Forms 的表單,彼每一个 Web Form 攏愛有一个 ` < form runat=" server " > < / form > ` 區塊,所有的 ASP . NET 侍服器控制項攏愛囥佇這个區域內底,按呢才會當予 ViewState 等待服器控制會當順序的運作。

佇網頁內底嘛會當用程式碼,以類似 ASP 時代的編寫方式來開發,這款開發方式號做inline code,佇咧 ASP . NET 的程式開發模式中,inline code,愛囥咧 ` < script runat=" server " > < / script > ` 區域中,如下列的範例程式:

另外一種模式是將程式碼佮網頁分離,這種模式叫做停跤碼後置 ( Code-Behind ),這个方法會當將程式碼獨立到一个檔案中,網頁會當保持較清氣的狀態,予維護網頁程式的複雜度降低真濟,佇網頁的提示指令 ( directive ) 中,會當設定程式碼後置的參數,像講 Inherit、CodeFile、Class 等參數。

而一个典型的坎站後置例為:

用程式碼後置模式的設定時陣,會當予 ASP . NET 執行 ia̋n-jín 咧載入網頁的時陣,由程式碼後置參數取得對應的類別資訊,藉以使用 Reflection 的方式來執行後置的程式碼。

ASP . NET 會當支援 HTML 和 XHTML 兩種網頁內容,猶毋過佇 Visual Studio . NET 中,預設是使用 HTML,猶毋過佇 Visual Studio 二千空五以後的版本,則一律攏改用 XHTML 格式。

控制項

ASP . NET 內底起控制項分做兩種:

  • HTML 控制項 ( HTML control ):直接佇 HTML 標記中加上 runat=" server ",即可對應著 ASP . NET 指定的 HTML 侍服器控制項類別,像講:
  • HtmlAnchor:表示 HTML 的 < a >。
  • HtmlButton:表示 HTML 的 < input type=" button " >。
  • HtmlImage:表示 HTML 的 < img >。
  • HtmlGenericControl:表示無對應著侍服器控制項的物件,攏會去予對應著這个類別。
  • Web 控制項 ( Web control ):由 ASP . NET 提供,比 HTML 控制項提供閣較濟的功能,毋過操作佮設定會比 HTML 控制項愛複雜真濟,像講:
  • LinkButton:一種外型為連結 ( < a > ) 的揤鈕。
  • CheckBoxList:建立 CheckBox 的清單控制項。
  • GridView:共資料結做伙閣產生 HTML 格仔的控制項。
  • RequiredFieldValidator:檢查欄位敢有輸入資料的控制項。

除了內底起的控制項以外,ASP . NET 嘛提供會當自訂的控制項架構,並且支援兩種控制項開發方法:

  • 使用者控制項 ( User control ),以 . ascx 為副檔名,會當予開發人員用上輕鬆的方式來開發控制項,優點伊是開發速度足緊,但缺點是無法度轉散布,而且無法度加入參考。
  • 自訂控制項 ( Custom control ),會當轉散布型的控制項,是經過編譯以後的程式碼 ( DLL ),可單獨轉散布,而且會當佇其他的專案加入參考取用,自訂控制項有三種開發模式:
  • 基礎控制項 ( General Control ):由 System . Web . UI . Control 類別繼承來,抑是去予現有的 Web 控制項繼承來,親像由 Button 控制項繼承。
  • 複合控制項 ( Composite Control ):由 System . Web . UI . WebControls . CompositeControl 繼承來,會當用複合的方式來開發控制項。
  • 模板控制項 ( Template Control ):會當佇控制項內底使用模板 ( template ),閣套用資料到模仔內底,支援資料結做的運算式。

指令碼

ASP . NET 的 Web 控制項有時仔會包裝一寡使用者捀指令碼 ( client-side scripting ),佇咧控制項予人畫的時陣輸出到使用者捀,遮的指令碼多數予人包裝佇 DLL 的資源檔中,並由 ScriptResource . axd 處理常式來輸出,開發人員嘛會當利用 ClientScriptManager(Page . ClientScript 屬性)中的方法來添加指令碼到網頁的程式內底,定用的方法有:

  • ClientScriptManager . RegisterClientScriptBlock ( ):註冊使用者捀指令碼區塊 ( script block )。
  • ClientScriptManager . RegisterStartupScript ( ):註冊做伙的時陣執行的指令碼。
  • ClientScriptManager . RegisterOnSubmitStatement ( ):註冊咧處理表單發送的時愛執行的指令碼。
  • ClientScriptManager . RegisterClientScriptInclude ( ):註冊是由外部檔案 ( . js ) 提供的指令碼來源。

基本的物件

以往佇咧 ASP 中常予人使用的五大基本物件,佇咧 ASP . NET 猶持續受支援,但是𪜶攏換一个身份來提供:

  • Application:包裝矣 HttpApplication 東西,佇程式內底使用 Application 指令取得的東西,攏是來自 HttpContext . Current . Application 屬性回傳甲。
  • Request:包裝矣 HttpRequest 東西,佇程式內底使用 Request 指令取得的東西,攏是來自 HttpContext . Current . Request 屬性回傳甲。
  • Response:包裝矣 HttpResponse 東西,佇程式內底使用 Response 指令取得的東西,攏是來自 HttpContext . Current . Response 屬性回傳甲。
  • Session:包裝矣 HttpSessionState 東西,佇程式內底使用 Session 指令取得的東西,攏是來自 HttpContext . Current . Session 屬性回傳甲。
  • Server:包裝矣 HttpServerUtility 東西,佇程式內底使用 Server 指令取得的東西,攏是來自 HttpContext . Current . Server 屬性回傳甲。

導覽部件

導覽部件 ( navigation controls )是佇咧 ASP . NET 二鋪空內底才出現的功能,包含:

  • 選單 ( Menu ):提供內建的滑鼠偵測方式,實作階層式的選單功能。
  • 網站地圖 ( Sitemap ):提供可層次化目前瀏覽位置的功能,會當支援由 Web . sitemap 中的資料,抑是佇資料庫抑是 XML 資料檔中的資料來源。
  • 樹狀檢視 ( TreeView ):提供階層化的資料瀏覽,類似做案總管的介面。

應用程式服務

應用程式服務 ( application services ) 是佇咧 ASP . NET 二嬸空中才開始提供,伊以 Provider-based Pattern 為主,實作出數一个網站的常用服務,包括予人員服務 ( Membership Service )、角色服務 ( role service ) 佮設定檔服務 ( profile service ) 等。

會員服務由 Membership 佮其他的資料提供者 MembershipProvider 構成,應用程式使用 Membership 所顯露的方法來操作,伊會將要求轉送予指定的 MembershipProvider 實作來處理,ASP . NET 目前支援來自資料庫的 SqlMembershipProvider(支援 SQL Server)以及來自 Active Directory 的 ActiveDirectoryMembershipProvider,開發人員嘛會使家己由 MembershipProvider 繼承來實作自訂的會員服務資料提供者。

角色服務佮會員服務類似,由 Role 佮其他的資料提供者 RoleProvider 構成,應用程式使用 Role 所顯露的方法操作,由 RoleProvider 實作提供資料服務,目前內底起的 RoleProvider 有來自 Active Directory 抑是 XML 檔案的 AuthorizationStoreRoleProvider,由 SQL Server 供應資料的 SqlRoleProvider,閣有支援 Windows 角色的 WindowsTokenRoleProvider 三種,開發人員會當家己實作 RoleProvider 的方法以發展出自訂的角色服務提供者。

設定檔服務是一个特殊的服務,伊結合矣 . NET Framework 的 CodeDOM 開發模式,以及 System . Web . Profile 號名空間的 ProfileBase、ProfileInfo 佮 ProfileManager 等類別,組合出完整的設定檔支援,其資料來源嘛是以 Provider-based Pattern 為主,由 ProfileProvider 提供,ASP . NET 內建由 SQL Server 資料庫的建立的 SqlProfileProvider,其欄位緊由開發人員佇咧 ASP . NET 組態檔中家己的定義,才由 ASP . NET 動態產生強型別的欄位屬性。

設定檔服務嘛是做為 ASP . NET 二嬸零的網頁組件 ( Web Part Framework )所需要的設定檔儲存支援,Web Part Framework 會當予開發人員會當開發出具備個人化能力 ( Personalization ) 的網頁組態方案,予使用者會當用家己加添佮拖沙的方式來設計家己的網頁佈置,所需要的設定儲存即由設定檔服務處理。

另外一个需要佮應用程式服務配合使用的功能為Web 事件架構 ( Web Event Framework ),伊需要由應用程式服務提供資料結構,伊嘛是有 Provider-based Pattern,並且會當支援數種的事件資料提供者。

延展性支援

除了 ASP . NET 網頁以外,. NET Framework 閣提供兩種會當由開發人員家己發展處理模型的模組,一款是HTTP Handler,另外一種是HTTP Module

HTTP Handler(副檔名做 . ashx)由 System . Web . IHttpHandler 介面定義必要的方法(會當支援非同步的 HTTP Handler 這號做 HTTP Async Handler,由 System . Web . IHttpAsyncHandler 介面定義), 其中上重要的方法是 ProcessRequest ( ) 方法,開發人員必須愛實作這个方法,才會當予 HTTP Handler 有作用,伊嘛是會當透過 ASP . NET 的組態設定,予 HTTP Handler 會當處理特定的副檔名,伊會當予人看做是 . NET Framework 中的 ISAPI Extensions 實作方法。

HTTP Module 是由著 System . Web . IHttpModule 介面定義,伊會當佇幾个網頁性命週期中被呼叫濟擺,而且實際處理由 HttpApplication 所引發的事件,開發人員需要實作 IHttpModule . Init ( ) 方法,猶閣有處理 HttpApplication 事件需要的程式碼。伊會當予人看做是 . NET Framework 中的 ISAPI Filter 實作方法。

一致性佮多樣性介面的支援

ASP . NET 佇一開始的時陣是欠缺範本 ia̋n-jín ( template engine ) 的,其主因是 . NET Framework 本身是物件導向,而且需要用繼承的方式才會當延伸功能,大多數的開發人員攏是由 System . Web . UI . Page 繼承並定義出新的基礎類別,並且編寫欲畫圖 HTML 的方法,閣有佇𪜶的應用程式當中咧修改以繼承這種的應該類別,毋過這个方法可能會去予用佇網站的足濟所在,因為會大大的提升混合程式碼佮標記的複雜度,這個方法嘛只會當執行期才會當看覺化的方式測試,無法度佇設計時期的視覺化,其他開發人員總是使用原有的 ASP 方法(即 ` < !--# include--> ` 指令)來共逐个網頁需要的部份包到網頁內底,防止佇每一个網頁內底攏愛編寫仝款的導覽程式碼。

佇咧 ASP . NET 二孵空中,推出了母板頁面 ( master page )的概念,伊會當予開發人員先行定義外觀版型 ( \ * . master ),閣使用伊來套用實際執行的網頁,網頁佮主版頁面之間 ContentPlaceHolder 的 ID 做連結,以套用正確的內容到保留區(即由 ContentPlaceHolder 包蹛的區域)中,開發人員嘛會當定義咧保留區無套用的時陣需要顯示的預設內容。佇咧 ASP . NET 三更加進一步的支援設計時期的岫狀主版頁面 ( nested master pages ),佮共彼个網頁的 HEAD 區塊納入 ContentPlaceHolder 的範圍。

佮主版頁面相關的,閣有主題 ( Theme )以及面枋 ( skin )技術,這兩个技術允准開發人員抑是設計人員家己定義網頁的模樣設定猶閣有套用的模樣支援,每一个主題中會當包含數個面枋檔,遮的面枋檔決定矣控制項欲輸出時套用的模樣,開發人員則會當利用主題來決定無仝款的外觀欲使用的樣式。

ASP . NET 凡勢佇咧應用程式中動態的變更主版頁面佮主題,但是必須愛佇咧頁面的 PreInit 定式的設定。

編譯模型

ASP . NET 佇一 . x 時,使用的是組件為主的編譯方式,一个網頁干焦會產生一个組件,這个方式上大的優點,就是會當自由定義號名的空間,而且佇部署應用程式的時陣會較方便,毋過因為 ASP . NET 一 . x 四界的時代,若網站是有足濟程式碼的情形下(即 DLL 檔足大的), 載入的速度會變慢,而且佔用記憶體的量會足濟,彼當陣的記持體價數嘛猶未落到這馬的水準。所以佇遮 ASP . NET 二孵空開始,另外提供一个預先編譯( Pre-compilation ) 的編譯模型,這个編譯方法會共每一个網頁攏各自編譯做一个組件,其檔案的名稱會是 App \ _ [亂數字串] . dll 號名,這个編譯時期由 ASP . NET Pre-compilation 工具(aspnet \ _ compiler . exe)予定,優點是會當毋免載入過量的程式碼到記持體中,但缺點是無法度自訂號名的空間,而且佇咧更新的時陣必須愛更新所有的 DLL 檔佮網頁等等,抑無會造成名稱無一致,予 DLL 無法度予人載入的問題。

早期 ASP . NET 二嬸零干焦提供預先編譯模式,予伊的缺點真緊的被暴露出來,就按呢軟微嘛為 ASP . NET 二嬸零開發矣沿用 ASP . NET 一 . x 的編譯模型的工具:Web Application Project,佇咧 Visual Studio 兩千空八中開始內起,到此,ASP . NET 支援兩種編譯模式的架構抵定。

安全性支援

ASP . NET 的安全性支援分做驗證 ( Authentication )授權 ( Authorization )兩个部份。

驗證

ASP . NET 的驗證方式有三種:

  • Windows 驗證:由 IIS 目前所執行的口座,抑是使用者類比 ( user impersonate ) 口座的方式來進行驗證。
  • 表單驗證:由表單的資料提供驗證,開發人員自訂驗證邏輯,閣交由 ASP . NET 表單驗證工具寫入驗證憑證,以進行授權。
  • Passport 驗證:佇咧 ASP . NET 一 . x 中,連接 Windows Live ID(彼陣的舊名 Microsoft Passport)服務以進行驗證。

授權

ASP . NET 的授權方式有兩種:

  • 檔案授權:由 ASP . NET 檢查檔案的存取控制表 ( ACL ) 來授權存取權限。
  • URL 授權:由開發人員設定的 URL 來給給權限。

一个 URL 授權的設定範譬如講下:

Web Service 支援

ASP . NET 一孵空開始支援 Web Service 的開發,是微軟佇原生平台頂支援 Web Service 發展的第一个實作品,但是伊煞毋是微軟仔第一个 Web Service 開發工具實作品,. NET Framework 中提供一个 WSDL . exe,會用得連接 Web Service 下載 WSDL 定義檔,並產生一个 Proxy Class 的原始碼,供使用者捀應用程式使用,如果使用 Visual Studio 開發的話,這个動作會由「加入 Web 參考」的動作佇背後處理掉。

ASP . NET Web Service 的發展干焦是平台的基礎,軟軟仔佇咧 Web Service 的開發上提供繼續的支援,尤其是佇咧 WS-I ( Web Service Interoperability ) 組織成立了後,為符合 WS-I 的 Web Service 標準,軟軟開發矣強化 Web Service 的增強套件 Web Service Enhancement ( WSE ),上新版本為三更零版(配搭 ASP . NET 二孵空), 真正會當支援真濟 WS-I 的標準。

因為 Windows Communication Foundation 的推出,微軟將 Web Service 的發展重心徙去 WCF 上,原有的 ASP . NET Web Service 隨予定一个名稱:ASMX Web Service

擴充功能

ASP . NET 佇這二板的時,功能已經誠底定著,成做 Web 應用程式的基礎架構,微軟開始佇咧 ASP . NET 二嬸空上開發擴充的功能,包括講 AJAX 的支援、MVC 架構的支援猶閣有閣較容易開發出資料庫應用的架構。

ASP . NET AJAX

ASP . NET AJAX 是微軟發展的 AJAX Framework,予 ASP . NET 的開發啊人員著愛用真簡單的方式就會當開發出支援 AJAX ( AJAX-enabled ) 的應用程式,包括使用者捀指令碼的支援,猶閣有侍服器捀的連結等等。

ASP . NET MVC Framework

ASP . NET MVC Framework 是微軟是因為 MVC ( Model-View-Controller ) 架構所開發的架構,予應用程式各個模型會當佇咧 MVC 架構下運行。

  • View:負責顯示資料佮使用者介面,佇咧 ASP . NET MVC 架構下跤,View 會當支援 REST 看起來的 URL。
  • Model:負責定義資料的儲存,所以部份會當由此 LINQ to SQL 佮 ADO . NET Entity Framework 來代替。
  • Controller:負責處理 View 和 Model 之間的聯絡。

ASP . NET MVC Framework 也支援來測試驅動的開發模式 ( Test-Driven Development )。

ASP . NET Dynamic Data Framework

ASP . NET Dynamic Data Framework 是略仔軟佇咧 ASP . NET 三孵五中開發的一組類別庫,封裝佇 System . Web . DynamicData 號名空間內底,並且配合 ASP . NET Routing Model(網頁送功能)予開發人員會當真簡單的開發出基於 LINQ to SQL 抑是講 ADO . NET Entity Framework 資料模型的資料庫應用程式。

ASP . NET Routing

ASP . NET Routing Model(官方譯名做 ASP . NET 路由)是一个是對 REST 規格下的 URL 對應機制,開發人員會使踮服器捀設定 URL 的格式,使用者會當用由開發人員定義的 URL 格式瀏覽網頁,ASP . NET 會自動將 URL 轉換做是內部的 URL 格式,雖然伊和 URL Rewriting 足成,毋過微軟認為 ASP . NET Routing 毋是呢 URL Rewriting。

Silverlight

Silverlight 是微軟的新一代 RIA 技術,ASP . NET 三人五 Service Pack 一 ( SP 一 ) 加入矣著 Silverlight 二嬸零的 ASP . NET 侍服器捀支援,包含:

  • Silverlight 控制項:予侍服器捀會當產生支援 Silverlight 的物件標記,以及自訂參數等。
  • Media 控制項:予侍服器捀輸出就 Silverlight 為主的串流影音 ( streaming media ) 放送器。

開發工具

目前已經有幾若个工具會當支援 ASP . NET 應用程式的開發。

  • Visual Web Developer 兩千空八 Express Edition(免錢)抑是 Visual Studio 兩千空八 ( ASP . NET 二 . 三分之零 . 五 )
  • Visual Web Developer 兩千空五 Express Edition(免錢)抑是 Visual Studio 兩千空五 ( ASP . NET 二孵空 )
  • Visual Studio . NET ( ASP . NET 一 . x )
  • Delphi 二千空六
  • Macromedia HomeSite 五鋪五 ( For ASP Tags )
  • Microsoft Expression Web,Microsoft Expression Studio 工具集的一部份
  • Microsoft SharePoint Designer
  • MonoDevelop(免錢/開放原始碼)
  • SharpDevelop(免錢/開放原始碼)
  • Eiffel for ASP . NET(免錢)
  • WebMatrix 三(免錢)
  • Adobe Dreamweaver CC。

版本

一台電腦,檢視 Windows 登錄檔的

` ` ` HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP \ v 四 \ Full ` ` `

其實 Version 節點顯示的就是所安裝的 ASP . NET 的版本號。

參見

  • ASP . NET Core
  • . NET Framework
  • Visual Studio
  • Microsoft Silverlight
  • ASP
  • ADO . NET
  • Web Service
  • PHP
  • JSP

參考資料

外部連結

  • (繁體中文)ASP . NET Overview
  • (英文)ASP . NET Official Site
  • (英文)ASP . NET Developer Center on MSDN
  • (英文)ASP . NET Web Blogs