網站的性能對於ASP.NET程序開發人員來說非常重要。一個優秀的網站雖然有美觀的頁面設計,完善的服務功能,但是打開網頁時有長時間的延遲,用戶最終將會無法忍受。尤其對於大型的電子商務網站而言,每秒鐘有數萬用戶同時訪問,沒有良好的網站性能,根本無法滿足龐大的需求。
ASP.NET作為全新一代的動態網頁生成系統,它在平台性能方面與原有的ASP相比已有了一個本質的提高。但要在此基礎上開發出專業水准的、符合生產標准的、受用戶歡迎的web應用程序,還需要開發人員從編程的角度在頁面、數據訪問和字符串處理等各方面進行優化處理,以提高網站的總體性能。
本文將主要探討在ASP.NET中與此相關的幾種進行性能優化的方法及注意問題。
頁面性能優化
1、會話狀態的恰當選擇
HTTP協議是一種無狀態的通信協議,無法記錄和識別來自不同客戶端的請求,但在實際應用中系統卻要維護來自客戶端的不同請求之間的會話狀態信息。ASP.NET通過將會話狀態信息存儲在進程、狀態服務器或SQL Server數據庫中來解決這個問題。
將會話狀態信息保存在WEB服務器的內存中具有最佳的性能,速度很快,但是卻缺乏會話狀態信息跨越多個服務器的能力。若要在多個WEB服務器之間維護會話信息,可以使用狀態服務器進行存儲,這種方式由於可以將應用程序部署到多台服務器上而提高了系統的伸縮性和可靠性,但是以降低性能為代價。對於極其重要的會話信息,需要使用SQL Server存儲方式,從而避免丟失重要的會話信息,但由此產生的工作負載比前兩者大得多。
若不考慮狀態信息的保留和多個服務器共享,應盡量選擇保存在服務器的進程中,從而得到最佳的性能。
會話狀態信息的存儲方式選擇通過web.config文件:
<sessionState
mode="InProc/StateServer/SqlServer" //存儲方式由此行選擇
stateConnectionString="tcpip=127.0.0.1:42424"
……
timeout="20"/>
2、服務器控件的優化選擇
2.1 減少不必要的服務器控件
服務器控件帶來的方便和功能是html控件所不能比擬的。但是每一個服務器控件都需要在服務器端創建相應的對象,是以犧牲服務器端的資源為代價的,過多的使用服務器控件會極大的影響程序性能。
很多情況下,簡單地使用html標記或數據綁定即能夠實現所需功能。比如<asp:Label>控件,若使用它來顯示靜態信息,則完全可用簡單的標記來實現。如果html控件達不到所要實現的功能,而且在腳本語言如javascript、vbscript也不能實現的情況下,才考慮選擇服務器控件。
2.2 禁用不必要的狀態視圖
服務器控件的狀態視圖屬性能夠自動的在頁面往返過程中維護服務器控件的狀態,減少開發者的工作量,但是需要占用大量的服務器內存資源。因此,在不需要服務器控件狀態視圖的情況下,應將其EnableViewState屬性設置為false,如常用的<asp:Lable>和<asp:Button>控件。
2.3 Page.IsPostBack的運用
Page.IsPostBack用於記錄頁面是否從客戶端返回,若為false表示初次運行,否則表示從客戶端再次返回該頁面。Page.IsPostBack的合理應用可以避免頁面在往返過程中的一些不必要的操作。在Page_Load函數及一些只需要初始化一次的事件函數中均可以使用該屬性來提高應用程序性能。
void Page_Load(Object o, EventArgs e)
{
if(! Page.IsPostBack)
{
conn=new SqlConnection("server=localhost;uid=sa;pwd=;database=data");
String sql="select * from student";
cmd.Fill(ds,"stu");
mydataGrid.DataBind();
}
}
以上代碼將保證只有在首次訪問該頁面時對數據庫進行讀取並綁定。