程式
怎樣建立魯棒性、正確性、可維護性和效能俱佳的ASP應用程式?要做什嗎?不做什嗎?本文以提綱的形式,給出了主要的Check-Points(檢查點)。
什麼是ASP
Active Server Page,簡稱ASP,是:
l串連網友介面(HTML)和商業邏輯(Business Logic);
l提供一致的、容易使用的、有狀態保持的、基於WEB的用戶端;
l為那些需要交易處理的WEB 應用提供應用程式環境。
ASP不是:
l 實現商業邏輯(Business Logic)的地方;商業邏輯應該通過COM+、MTS或者資料庫來實現。
ASP的使用者應該有下面的教訓:
l 開發應用程式,而不是開發一個一個的孤立ASP頁面;
l 對輸入和輸出進行緩衝;
l 在發布之前要測試;
l 選擇效能較好的組件;
l 減少資料庫的存取:緩衝變換後的結果;
l 使用MSMQ來處理有時間延遲的工作;
網站設計
u 你的網站想提供什嗎?
u 資訊架構:80/20準則;
u 網站導覽;
u 頁面配置;
u 可用性;
n 使用ALT和Title屬性;
n 不使用圖片或者Image Map的導航;
u 適合大多數低版本瀏覽器,考慮他們對ActiveX、RDS、XML、DHTML、Java Applet的支援狀況;
u 螢幕解析度和螢幕顏色數
n 是否支援WebTV、PDA…?
n 設定IMG的width和height屬性。
u 非瀏覽器的訪問,如自動機器人(Spider);
u 使用幀(Frame)?
u 使用Cookies的個人化;
u 避免壞串連;
u 使用meta標籤;
u 內容審核;
u 內容檢索;
u 結果反饋:使用者反饋和跟蹤;
u 減少下載時間;
三層、四層應用設計
可讀性、可維護性
u 使用注釋;
u 在VBScript指令碼中使用<%Option Explicit%>;
u 使用字串變數儲存SQL字串:便於調試;
u 使用Server.MapPath和相對路徑;
u 使用ADODB.INC或者<!—metadata typelib=somelib file=somedll-->來引用常量,不要直接使用常量數值。
u 指定ADO調用的預設參數,避免出錯;
u 使用庫或者組件來封裝代碼。
正確的方法:
u 使用Server.URLEncode
u 錯誤捕獲和處理
國際化:
u 使用<%CodePage%>
u 使用Session.CodePage
u 在IIS5.0中,Response.write支援UTF8
其他:
u 使用#include 重用代碼
u 使用分頁技術
網站安全:
u 客戶身分識別驗證
u 輸入驗證
u #include 檔案不要使用.INC尾碼,使用.ASP或者設定.INC的應用程式對應
u 把MDB檔案存放在非WEB路徑下;
u 使用ADSI做安全管理
Session和Application狀態
Session的使用:
u 使用起來很方便但是很有問題;
u HTTP是一個無狀態的協議;
u 設計購物推車特別有用;
u 不利於延展性設計(Scalability);
u 在不需要Session的頁面中使用<%EnableSessionState=false%>
u 儘可能完全避免使用Session;
u 在多個web伺服器情況下不適合;
u 某些組件使Session運行在單一線程模式,減少了輸送量;
u 消耗記憶體;
u Session有逾時的問題
u 需要用戶端的瀏覽器開啟cookie設定;
u 不要在session中儲存recordset,或者緩衝connection對象;
u 在global.asa不要使用空的Session_OnEnd;
u 可選方案:
n cookies
u 直接狀態編碼:簡單、容易、不安全
u 後端資料庫的ID作為狀態值
n querystring 參數
n 如amazon的url方式
n 隱藏的表單
Application變數:
u 共用變數
u 不能持久儲存
u 多個web伺服器時不行,除非只是唯讀變數。
緩衝
u 對靜態內容非常理想
u 不要使用Response.Expires=0,使用負數:
n Response.Expires=-10000;
n Response.AddHeader “Pragma”,”no-cache”
uResponse.AddHeader “cache-control”,”no-store”
u 伺服器緩衝
u proxy緩衝
u 用戶端緩衝
組件
u 效能
u 伸縮性
u 分離商務邏輯和頁面表現
u 被ASP或其他環境重用
u 交易處理
u 型別安全
u 存取作業系統特性
u 保護智慧財產權
u 在下列情況下使用Server.CreateObject:
n MTS交易處理
n 上下文安全性
n ASP內部組件
n OnStartPage、OnEndPage
u 使用<Object RunAt=server>延遲物件初始化
u 是否儲存到Session或者Application變數中
u
效能
n Response緩衝:Response.Buffer=True
n 關閉Connection並:set Connection=Nothing
n 使用局部變數
n 用<Object >代替Server.CreateObject
n 不要使用Session和Application變數
n 不要將COMObject Storage Service在Session或者Application變數中
n 關閉指令碼調試
n 避免重複的字串相加
n 在費時的頁面頂端使用Response.IsClientConnected
n 使用MSMQ
n 不要在Session或者Application中儲存大數組
n 不要ReDim 數組
n 將集合類型的對象賦給臨時變數
n 減小微處理器的最大線程數(運行regedt32,在HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\w3SVC\ASP\Parameters,增加ProcessorThreadMax,減小這個值,看看效能的變化;或者增大這個值。)
n 設定AspScriptEngineCacheMax,使它等於ProcessorThreadMax*CPU個數。預設的是30;(在系統路徑下:\system32\inetsrv/adminisamples下,鍵入adsutil.vbs,設定/w3svc/AspScriptEngineCacheMax);
n 減少Session.Timeout;
n 在MMC中,設定ASP應用程式緩衝為有效。
把某些工作交給用戶端:
n CSS、DHTML
n XML
n RDS
n Remote Scripting
n Xmlhttp
n 用戶端驗證
n 減小檔案大小
n 儘可能避免https和SSL
n 使用Response.End測試效能
n
資料庫
n 減少資料庫存取訪問;
n 緩衝變換後的結果;
n 使用ODBC串連池和OLEDB資源集區;
n 使用系統DSN或者非DSN,不要使用DSN或者檔案DSN;
n 使ADO運行在雙線程模式(Both-threaded):makefre.bat;
n 使用ADO的Field對象;
n GetString或者GetRows比較快;
n RDS和XML把負載嫁到用戶端;
n 不要使用Select *,把欄位寫出來;
n 盡量使用SQL Server 7,不要使用Access;
n 使用SQL Server的特性:預存程序、Job、Join、sort、group
n 使用SQL Analysis,最佳化SQL的效能
n 使用索引
n 本地使用Name-pipes,遠程使用Sockets
n 準確地指定Command Type
IIS 5的新特性
n 可靠的重新啟動
n ASP效能提高
n Server.Transfer比Server.Redirect更好
n Server.Execute
n Server.GetLastError