應用程序服務器被或最終將被 Web 服務器所使用它通常是運行 ASP 頁面的 IIS 計算機ASP 是您的對象的唯一客戶機它帶來了專門的線程和安全考慮
雖然許多使用 ASP 的 Web 站點根本就不用組件但在這篇文章中假定 ASP 是 Internet 客戶機和組件之間的橋梁下面的 asp/serverasp\>ASP 組件准則(英文)提供
ASP 和組件之間的劃分服務
ASP 最常用於在服務器上創建供客戶機使用的 HTML 或 XML 文件因此我們主要討論這種使用方案這就引出了一個常見的問題如果 ASP 頁面在服務器上那麼它們是否屬於業務層的一部分呢?在組件世界中答案通常是否雖然 ASP 確實在服務器上運行而且可能與應用程序服務器在同一個空間但是這不能使它成為業務邏輯的一部分
隨著用戶界面工具的發展或者隨著啟用更多的業務對業務方案擁有這種明確的區別將獲得巨大的回報
話說到此讓我們來看一些最重要的業務層和表示層劃分准則
令 UI 代碼與業務邏輯分離這包括編寫與 UI 耦合的代碼例如使用 ASP 內部組件的 MTS 對象讓它與業務邏輯代碼分離如同在不同的 DLL 中
將事務與 ASP 頁面分離事務 ASP 在某些情況下非常好但是組件和多層應用程序會改變這種情況組件不應該依賴由客戶機層來管理它們的事務和業務邏輯語義
將表示組件(使用請求和響應的組件)與 Web 服務器放在相同的機器和/或進程中如果將使用 ASP 內部組件對象的對象放在遠程機器上那麼對內部組件的所有調用將以回調形式發生調用 IIS 客戶機的是 COM+ 服務器它顯著降低了性能並使安全配置復雜化可以將這些調整對象放在標記為庫激活的 COM+ 應用程序中
ASP 存在於服務器上因此 ASP 頁面必須符合資源共享規則並且記住可伸縮性請看下面的詳細內容
在會話中管理應盡量避免用戶特定的狀態
保持 ASP 無狀態並在可能的情況下允許資源池
操作方式
在評價某個代碼段是否屬於業務邏輯或者表示層時請問一下自己如果我必須用按鍵式電話應用程序代替我的 ASP 頁面那麼該代碼是否還有用?如果答案為是那麼可以嘗試將它劃分為業務邏輯代碼或者用戶界面幫助器代碼
如果改變了客戶機後該代碼不能用或者如果它是構造用戶界面的幫助器則該代碼屬於表示服務層它在 ASP 頁面中或在使用 ASP 內部組件的組件中它不屬於業務對象組件
理解桌面與 ASP 客戶機的區別
ASP 是組件的特殊客戶機不同於桌面上的傳統單線程 Win 應用程序主要區別概括如下
線程管理ASP 是多線程客戶機這意味著可以有許多並發活動一起運行也許在同一時刻處理不同的 ASP 頁面這說明不能使對象偽稱它是唯一的使用者來獨占系統這樣做可能有意外的反應例如養成一個壞習慣將對象存儲在 ASP 會話或者應用程序變量中 [Page]
安全環境ASP 是由 Web 站點中的 Internet Information Services 執行的有低中高三種隔離度甚至這些 Web 站點可以有不同的安全設置允許或拒絕匿名訪問驗證客戶等等所有這些設置產生了大量的方案即不同的用戶帳戶最終用的是您的對象
輕松增長這不是技術問題而是 Web 應用程序所提供設施的副效應傳統上為桌面應用程序增加用戶基要求仔細計劃好向已知數量客戶機的轉出ASP 已經改變了該過程在啟動和運行後ASPVisual Basic 應用程序可以方便地打開供當地的或世界范圍的所有職員所有業務伙伴和所有客戶使用可以用這種方式描述 — 擁有超鏈接的單個電子郵件可以使用戶基成十倍地增長您的應用程序為此作好准備了嗎?唯一了解的方式是對 Web 站點進行強度測試以獲得實際性能的預期值關於強度測試的詳細信息請參閱應用程序生命周期一節
在 ASP 內應該如何使用 Visual Basic 對象?在頁面范圍內創建和取消您的對象也就是說盡可能使 ASP 頁面無狀態只在暫時狀態下依賴會話或應用程序變量不要將對象存儲在會話或應用程序變量中這將 ASP 線程鎖定到您的會話取消所有可伸縮性的預期值也就是說Web 服務器處理的用戶數不會超過幾十個如果需要在會話或應用程序中存儲內容請使之成為數據而不是對象
還有可以遵守的許多其他准則我們建議您閱讀 MSDN Voices 上 J D Meier 撰寫的專欄Servin it Up該專欄包括了大量的技術實踐和技巧有助於開發可擴展的可靠的 ASP 和組件應用程序
參考
asp#server\>MSDN Voices Servin it Up Column(英文)
SeminarOnline在 ASP 下使用自定義 COM 組件(英文)
asp\>MSDN 雜志(英文)不要將引用存儲在會話或應用程序中的 VB 對象中
所有 Visual Basic 組件都是單元線程的就是說它們都運行在 STA 單元中這意味著如果在線程中創建對象那麼對該對象的所有調用都必須用同一線程服務許多線程(來自並發 Web 站點用戶)使用 STA 對象的同一實例會引起一連串的活動有可能成為應用程序中的瓶頸
此外在會話范圍內存儲用 ServerCreateObject 創建的 STA 對象可以有效地將執行線程聯系到當前用戶從而將應用程序的最大並發用戶數限制到默認的 xN(N = 處理器數量)
操作方式
如果您按照我們的建議使對象無狀態則不需要存儲引用以供客戶機復用並在應用程序范圍內存儲它們客戶機將能夠獨立創建使用和取消它們自己的對象這就減少了保持會話特有對象的需要原因是它們不保留會話特有的狀態 [Page]
推薦的方式是使對象無狀態它在需要時訪問數據庫或其他存儲區(例如 cookies 和 LDAP)
如果需要使用會話或應用程序范圍的數據請將數據而不是處理數據的對象存儲在此您可以創建一個類來封裝對所需值的處理
參考
asp\>信息不要在會話或應用程序中存儲 STA 對象 (Q)(英文)
PRB將 STA COM 組件存儲在會話中會將會話鎖定在單線程中 (Q)(英文)
信息ASP 下的組件線程模型概要 (Q)(英文)
學習 IIS 中的新內容
Internet Information Server 增加了許多新功能這些改進均已寫入 JD Meier 的 MSDN 文章中asp/serverasp\>沿用 IIS 中的 ASP(英文)下面是該文中最重要改進的概述
改進的出色的性能
ServerTransfer 和 ServerExecute 方法
集中式錯誤處理
改進的浏覽器功能
改進的腳本引擎
正則表達式分析器
與 ADO 記錄集 XML 功能的集成
新的安全性緩沖隔離和管理功能
From:http://tw.wingwit.com/Article/program/net/201311/11406.html