如何提高ASP.NET性能(2)—Response.Redirect

 

你使用Response.Redirect嗎?

搜索你的代碼爲“Response.Redirect”,並考慮更換與Server.Transfer的。這並不招致了一個新的請求成本,因爲它避免了任何客戶端重定向。

你不能總是簡單地取代Response.Redirect調用Server.Transfer的調用,因爲Server.Transfer使用一個新的處理程序在執行的處理程序階段。Response.Redirect產生第二個請求。如果你需要不同的身份驗證和授權,緩存,或其他運行時設備上的目標,這兩個機制是不等價的。Response.Redirect導致一個額外的請求被髮送到服務器。Response.Redirect也使得用戶可見的網址。這可能需要在某些情況下,您要求用戶書籤的新位置。

你使用Page.IsPostBack?

檢查在你的頁面的邏輯使用Page.IsPostBack屬性,以減少多餘的處理,避免不必要的初始化成本。使用Page.IsPostBack屬性有條件地執行代碼,根據頁面是否是響應服務器控件事件生成,或者它是否是首次加載。

你驗證用戶輸入?

檢查,驗證用戶輸入客戶端上,以減少服務器的往返行程。這也提供了更好的反饋給用戶。出於安全原因,確保任何客戶端驗證與對應的服務器端驗證讚揚。

你有沒有制定明確和嚴格的真實?

確保您使用Option Strict和明確,以減少意外的後期綁定,當使用Visual Basic。NET中。

  1. <%@ Page Language="VB" Explicit="true" Strict="true" %> 

這可以很容易地搜索,使用正則表達式的Findstr.exe進行文件。

  1. C:\findstr /i /s /r /c:"<%.*@.*page.*%>" *.aspx  
  2. pag\default.aspx:<%@ Page Language="VB" %> 
  3. pag\login.aspx:<%@ page Language="VB" %> 
  4. pag\main.aspx:<%@ Page Language="VB" Explicit="true" Strict="true" %> 
  5. ... 

您已禁用調試?

檢查你的Web.config文件,並確保調試設置爲false 節和檢查。aspx頁,以確保調試設置爲false。如果啓用了調試,編譯器不生成優化的代碼和頁面批次編譯。您可以通過使用正則表達式的Findstr.exe進行文件。aspx頁。

  1. C:\pag>findstr /i /r /c:"<%.*@.*page.*debug=.*true*.*%>" *.aspx  
  2. login.aspx:<%@ page Language="VB" Debug="True" %> 
  3. main.aspx:<%@ Page Language="c#" Debug="True" %> 

您已禁用跟蹤?

檢查您的Web.config文件,以確保在部分禁用跟蹤。另外,請檢查你的。aspx頁,以確保跟蹤設置爲false。您可以通過使用正則表達式的Findstr.exe進行文件。aspx頁。

  1. C:\pag>findstr /i /r /c:"<%.*@.*page.*trace=.*true*.*%>" *.aspx  
  2. login.aspx:<%@ page Language="VB" Trace="True" %> 
  3. main.aspx:<%@ Page Language="c#" Trace="True" %> 

你積極的超時嗎?

設置超時積極相應調整。評估每一頁,並確定一個合理的超時。默認頁是在Machine.config執行超時屬性指定超時90秒。服務器資源舉行,直到請求被處理完全或執行時間,以較早者爲準。在大多數情況下,用戶不必等待這樣一個長時間才能完成的請求。他們要麼完全放棄請求,或發送一個新的請求,這進一步增加了服務器上的負載。

您使用視圖狀態?

使用下面的複習題,以評估您的應用程序如何有效地使用視圖狀態:

你禁用視圖狀態時,它不需要?

每一頁的評估,以確定是否需要查看狀態啓用。視圖狀態會增加開銷每個請求。開銷包括增加頁面發送到客戶端,以及一個序列化和反序列化成本的大小。你不需要查看在下列條件下的狀態:

頁面不回自己的頁面僅用於輸出和不依賴於響應處理。

你的頁面的服務器控件不處理事件,你有沒有動態的或數據綁定的屬性值(或他們是在每個請求的代碼)。

如果你忽略的舊數據,並重新填充的服務器控制每次刷新頁面。

您已經採取步驟,以減少您的視圖狀態的大小嗎?

評估每一頁的視圖狀態的使用。要確定一個頁面的視圖狀態的大小,您可以啓用跟蹤,看看每個每個控制如何使用它。控制控制的基礎上,禁用視圖狀態。

你使用服務器控件嗎?

使用下面的複習題,檢討如何有效地你的ASP.NET應用程序使用服務器控件:

你使用服務器控件時,你不需要嗎?

評估您的服務器控件的使用,以確定是否可以替換他們具有重量輕HTML控件或可能是靜態的文本。你也許可以在下列情況下更換一個服務器控件:

在控制顯示的數據是靜態的,例如,一個標籤。

你並不需要以編程方式訪問在服務器端控制。

控制顯示的是隻讀數據。

在回處理過程中不需要控制。

你有服務器控制的深層次嗎?

服務器控件嵌套很深的層次複合的建設控制樹成本。考慮呈現的內容自己使用Response.Write或建立一個自定義的控制,並呈現。要確定的控制和控制層次,使頁面的跟蹤。

您從您的ASPX頁面訪問數據嗎?

大多數ASP.NET應用程序需要某種形式的數據訪問。數據訪問的性能和可擴展性問題發現一個共同的地方。審查以下問題,以幫助改善您的應用程序的頁面級別的數據訪問:

你頁大的結果集?

確定您的應用程序領域,大的結果集顯示和考慮分頁的結果。大的結果集顯示給用戶,可以對性能有顯著影響。

你使用數據集時,你可以使用DataReaders嗎?

如果你不需要緩存數據,層與層之間或數據的交換數據綁定到一個控制和只需要只進,只讀訪問數據,然後使用DataReader,而不是。

您可以使用數據綁定嗎?

使用下面的複習題,審查代碼的數據綁定使用:

你用的Page.DataBind嗎?

避免調用的Page.DataBind和單獨的每個控件綁定優化您的數據綁定。調用的Page.DataBind遞歸調用上的每個頁面上的控件的DataBind。

你使用的DataBinder.Eval嗎?

DataBinder.Eval的使用反射,從而影響性能。在大多數情況下,DataBinder.Eval的被稱爲從一個頁面內多次,因此,實施替代方法提供了一個很好的機會,以提高性能。

避免以下做法:

  1. <itemtemplate> 
  2. <table><tbody><tr> 
  3. <td><%# DataBinder.Eval(Container.DataItem,"field1") %></td> 
  4. <td><%# DataBinder.Eval(Container.DataItem,"field2") %></td> 
  5. </tr></tbody></table> 
  6. </itemtemplate> 

使用顯式轉換。它提供了更好的性能,避免反射的成本。投作爲一個DataRowView Container.DataItem,如果數據源是DataSet。

  1. <itemtemplate> 
  2. <table><tbody><tr> 
  3. <td><%# ((DataRowView)Container.DataItem)["field1"] %></td> 
  4. <td><%# ((DataRowView)Container.DataItem)["field2"] %></td> 
  5. </tr></tbody></table> 
  6. </itemtemplate> 

投作爲一個String Container.DataItem如果數據源是一個數組或一個ArrayList。

  1. <itemtemplate> 
  2. <table><tbody><tr> 
  3. <td><%# ((String)Container.DataItem)["field1"] %></td> 
  4. <td><%# ((String)Container.DataItem)["field2"] %></td> 
  5. </tr></tbody></table> 
  6. </itemtemplate> 

aspx頁面調用非託管代碼嗎?

使用下面的複習題,審查代碼的互操作性使用:

你有沒有啓用調用STA COM組件ASPCOMPAT嗎?

確保任何頁面調用STA COM組件ASPCOMPAT頁面級別屬性設置。這將指示ASP.NET使用STA線程池線程來執行當前頁面的請求。默認情況下,ASP.NET使用MTA線程池來處理頁面請求。如果您正在使用STA元件,組件綁定到創建的線程。這將導致一個從線程池中的線程STA對象是創建的線程昂貴的線程切換。

你創建STA COM組件在頁面的構造?

檢查您的網頁,以確保您沒有創建STA COM組件在頁面的構造。創建STA組件中的Page_Load,Page_Init或其他事件,而不是。頁面的構造函數總是一個MTA線程上執行。當STA COM組件是從一個MTA線程創建,創建STA COM組件在主機上的STA線程。在同一個線程(主機STA)執行單元線程組件從MTA線程創建的所有實例。這意味着,即使所有的用戶都有他們自己的COM組件實例的引用,所有到這些組件的調用序列化這一個線程,並在同一時間只有一個呼叫執行。這將有效地瓶頸一個單獨的線程的頁面,並造成重大的性能下降。如果您使用的是AspCompat屬性,這些事件運行一個線程使用STA線程池,它在一個較小的性能結果擊中由於線程切換。

你用Server.Create對象嗎?

避免使用Server.CreateObject和早期綁定到您的組件在編譯時儘可能。Server.CreateObject的使用後期綁定,主要是爲了向後兼容提供。搜索您的代碼庫,看看是否使用這個例程,作爲替代,創建互操作程序集,利用早期綁定的優勢。

你有沒有審查Machine.config中的設置嗎?

使用下面的複習題,審查您的應用程序的部署計劃:

調整適當的線程池?

CLR線程池調整適當的調整,提高了性能顯著。在部署應用程序之前,確保該線程池已調整爲您的應用程序。

適當配置的內存限制?

配置ASP.NET內存限制,確保最佳的ASP.NET緩存的性能和服務器的穩定性。在IIS 5.0中,或者當您使用在IIS 6.0的ASP.NET進程模型,配置Machine.config中的內存限制。在IIS 6.0中,您使用IIS MMC管理單元中配置的內存限制。

你刪除不必要的HttpModules?

包括的HttpModules,你不需要添加額外的開銷ASP.NET請求處理。檢查您已刪除或註釋掉在未使用的HttpModules 的Machine.config。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章