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