寫ASP.NET應用程式代碼時注意的幾個問題

來源:互聯網
上載者:User

 1. 盡量減少表單回送

 每當點擊Web網頁上的Button、LinkButton或ImageButton控制項時,表單就會被發送到伺服器上。如果控制項的AutoPostBack屬性被設定為true,如果CheckBox、CheckBoxList等控制項的狀態被改變後,也會使表單會發送回伺服器。

  每次當表單被發送回伺服器,就會被重新載入,啟動Page_Load事件,執行Page_Load事件處理常式中的所有代碼。把網頁的初始化代碼放在這裡是最合適不過的了。我們經常會希望在每次載入網頁時執行一些代碼,而希望只有在網頁第一次載入時執行另一些代碼,甚至希望一些代碼在除首次載入外的每次載入時執行。

  可以利用IsPostBack特性來完成這一功能。在網頁第一次載入時,該屬性的值是false。如果網頁因回送而被重新載入,IsPostBack屬性的值就會被設定為true。通過測試,可以在任意時候執行指定的代碼。下面是相關的C#代碼:

 

protected void Page_Load(Object sender, EventArgs e) 
...{ 
 // 網頁每次載入時,執行的一些操作 
 if (!IsPostBack) 
 ...{ 
  // 網頁第一次載入時執行的操作 
 } 
 else 
 ...{ 
  // 回送時執行的操作 
 } 
 // 網頁每次載入時執行的操作 
}  

我們希望盡量不引起回送(每次回送都會要求伺服器進行一系列的操作),即使引起回送後。也希望能夠執行盡量少的操作。大規模、浪費時間的操作(例如資料庫尋找)尤其應當避免,因為它們能夠延長應用程式的回應時間。

2. 使用StringBuilder類

字串在.NET架構中是不可變的,這意味著改變字串的操作符和方法會返回字串的改變後的拷貝,這意味著效能還有提高的空間。當進行大量的字串操作時,使用StringBuilder類就是一種比較好的選擇了。

  下面的C#代碼測試用二種方式從10000個子字串中產生字串所需要的時間。第一次使用了一個簡單的字串串聯操作;第二次使用了StringBuilder類。

  要想查看結果字串,可以去掉下面的代碼中註解行的註解符號:

<%@ Page Language=”C#” %> 
<script runat=”server”> 
void Page_Load(Object Source, EventArgs E) 

 int intLimit = 10000; 
 DateTime startTime; 
 DateTime endTime; 
 TimeSpan elapsedTime; 
 string strSub; 
 string strWhole = “”; 
  
 // 首先執行字串串連操作 

 startTime = DateTime.Now; 
 for (int i=0; i < intLimit; i++) 
 { 
  strSub = i.ToString(); 
  strWhole = strWhole + “ “ + strSub; 
 } 
 endTime = DateTime.Now; 
 elapsedTime = endTime - startTime; 
 lblConcat.Text = elapsedTime.ToString(); 
 // lblConcatString.Text = strWhole; 
 
 // 使用stringBuilder類進行同樣的操作 
 startTime = DateTime.Now; 
 StringBuilder sb = new StringBuilder(); 
 for (int i=0; i < intLimit; i++) 
 { 
  strSub = i.ToString(); 
  sb.Append(“ “); 
  sb.Append(strSub); 
 } 
 endTime = DateTime.Now; 
 elapsedTime = endTime - startTime; 
 lblBuild.Text = elapsedTime.ToString(); 
 // lblBuildString.Text = sb.ToString(); 

  
</script> 
<html> 
<body> 
<form runat=”server”> 
 
 <h1>String Concatenation Benchmark</h1> 
  Concatenation: 
 <asp:Label id=”lblConcat” runat=”server”/> 
 <br/> 

 <asp:Label id=”lblConcatString” runat=”server”/> 
 <br/> <br/> 
  
 StringBuilder: 
 <asp:Label id=”lblBuild” runat=”server”/> 
  
 <br/> 
 <asp:Label id=”lblBuildString” runat=”server”/> 
  
</form> 
</body> 
</html>

二種方式的差別是相當大的:使用StringBuilder類的Append方法的速度比使用字串串連的速度快近200倍。

3. 只在必要時使用伺服器端控制項

ASP.NET中新引入了一種在伺服器端啟動並執行被稱作Web Server Controls的控制項,在代碼中,它們經常通過下面的文法被說明:   
<asp:TextBox id=”txtLastName” size=”40” runat=”server” /> 它們有時也被稱作ASP控制項。伺服器端控制項是由runat屬性指示的,它的值總是“server”。

  通過添加runat屬性,一般的HTML控制項可以被很方便地轉換到伺服器端運行,下面是一個簡單的例子:   

<input type=”text” id=”txtLastName” size=”40” runat=”server” />  

可以通過id屬性中指定的名字,我們可以引用程式中的控制項,可以通過編程的方式設定屬性和獲得值,因此,伺服器端處理方式有較大的靈活性。

  這種靈活性是有一定代價的。每種伺服器端控制項都會消耗伺服器上的資源。

  另外,除非控制項、網頁或應用程式明確地禁止view state,控制項的狀態是包含在view state的隱藏欄位中,並在每次回送中都會被傳遞,這會引起嚴重的效能下降。

  在這方面的一個很好的例子是,網頁上控制項表格的應用,如果不需要在代碼中參考資料表格中的元素,則使用無需進行伺服器端處理的HTML表格。我們仍然可以在HTML表格單元中放置伺服器控制項,並在代碼中引用伺服器控制項。如果需要引用任意的表格元素,例如指定的單元,則整個表格必須是伺服器控制項。

4. HyperLink控制項、LinkButton控制項的差別

對於Web訪問者而言,HyperLink、LinkButton控制項是一樣的,但它們在功能方面仍然有較大的差異。當使用者點擊控制項時,HyperLink控制項會立即將使用者“導航”到目標URL,表件不會回送到伺服器上。LinkButton控制項則首先將表件發回到伺服器,然後將使用者導航到目標URL。如果在“到達”目標URL之前需要進行伺服器端處理,則使用LinkButton控制項;如果無需進行伺服器端處理,則可以使用HyperLink控制項。

5. 使用trace方法和trace屬性記錄Page目錄中網頁的執行情況

偵錯工具的一種古老的技術是在程式中的關健點插入輸出語句,通常情況下,輸出資訊中會包含重要變數的值,相關資訊可以輸出到螢幕、記錄檔或者資料庫。

  在ASP.NET中,通過使用Page命令中的trace屬性,這種調試技術的使用更簡單了。Page命令是ASPX檔案開始處的一行代碼,它提供編譯器的指示。Page命令中包含一個或多個屬性,向編譯器提供使用的程式設計語言、代碼支援檔案的位置或要繼承的類的名字等資訊。

  Page命令中的屬性之一是trace,其值可能是true或false,下面是一個典型的Page命令,其中的trace屬性的值是true:

<%@ Page language=”c#” trace=”true” %> 

如果trace屬性的值設定為true,由ASPX檔案產生的Web頁就會顯示出來,除了網頁本身外,關於該頁的大量其他資訊也會顯示出來。這些資訊以下面小節的形式顯示在一張表格中:

  ·Request細節 提供Session ID、請求時間和請求的狀態代碼。

  ·Trace Information 包含追蹤記錄檔、網頁生命週期中按時間先後順序各個步驟的列表。另外,也可以向其中添加定製資訊。

  ·控制項樹 以一種分層次的方式列出網頁上的所有控制項,包括每個控制項以位元組計算的大小。

  ·Cookies集合 列出該網頁建立的所有Cookie。

  ·頭部集合 HTTP頭部以及它們的值。

  ·Server變數 與該網頁相關的Server環境變數。

  包含在Trace Information小節中的追蹤記錄檔是最有用的,在這裡我們可以插入自己的跟蹤命令。trace類中有2個方法能夠在追蹤記錄檔中插入命令:Trace.Write和Trace.Warn,除了Trace.Warn命令用紅色字型顯示、Trace.Write命令用黑色字型顯示外,它們是相同的。下面是追蹤記錄檔的一個螢幕快照,其中包含有幾個Trace.Warn命令。

  追蹤記錄檔中最方便的功能是我們可以在開發與測試過程中在整個代碼中插入Trace.Write和Trace.Warn語句,而在最終交付應用程式時,可以通過改變Page命令中trace屬性的值,禁止這些命令起作用,而無需在部署應用軟體前刪除這些輸出語句。

6.使用.NET命令列

.NET命令列工具在命令提示字元視窗中運行。為了使命令能夠執行,它必須駐留在命令提示字元的目前的目錄中,或通過設定PATH環境變數。
 .NET SDK在“啟動”菜單上安裝一個功能表項目,該功能表項目能夠開啟一個正確設定了PATH環境變數的命令提示字元視窗。我們可以通過依次點擊“開始”->“程式”->“Microsoft Visual Studio .NET”->“Visual Studio .NET工具”->“Visual Studio .NET命令提示字元”,啟動命令提示字元視窗。

  通過在將該功能表項目從菜單上拖到案頭上時,同時按Ctrl+C鍵,就可以將該功能表項目的捷徑拷貝到案頭上,使用起來會非常方便。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.