熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET錯誤處理和程序優化

2013-11-13 09:48:18  來源: .NET編程 
   議程
  錯誤類型以及處理方式
  提高數據訪問性能
  服務器控件的使用
  緩存的使用
  提高性能的實用技巧

  錯誤類型以及處理方式
  錯誤的類型
  分析程序錯誤
  –語法錯誤語法有問題
  –邏輯錯誤錯誤類型不匹配不正確輸出
  使用不正確的對象處理無效的數據
  編譯錯誤使用了不能被語言編譯器識別
  但ASPNET能識別的關鍵字或語句時發生的
  錯誤
  運行時錯誤
  配置錯誤nfig文件出錯

錯誤的處理
  使用驗證控件
  編程處理
  –校驗語句
  校驗(checked)和非校驗(unchecked)語句

  –trycatchfinally try{block} catch(FormatException){responsewrite(格式錯誤);} catch(OverflowException ){responsewrite(溢出);} catch(Exception ex){exMessageToString();}

  一些常用的引發異常:

  FormatException 當參數格式不符合調用的方法的參數規范時引發的異常

  ArithmeticException 因算術運算類型轉換或轉換操作中的錯誤而引發的異常

  OverflowException (繼承ArithmeticException )在選中的上下文中所進行的算術運算類型轉換或轉換操作導致溢出時引發的異常

  DivideByZeroException (繼承ArithmeticException )試圖用零除整數值或十進制數值時引發的異常

  –Page_Error

  Page對象的Error事件
  使用模板

   void Page_Error(object senderEventArgse) { ResponseWrite(發生錯誤:+ServerGetLastError()ToString()); ServerClearError(); } –Application_Error 在應用程序配置文件中為應用程序執行的聲明性錯誤處理 Appliation對象的Error事件 應用程序中任何頁面拋出異常都會調用 在globalasax中 形式為 void Application_Error(object senderEventArgse) { }

  DEMO
  編寫到windows錯誤日志
  把錯誤發送郵件到管理員

  利用配置文件處理錯誤
  ASPNET同以前的ASP一樣當服務器上發生了一個運
  行時間或編譯時間錯誤時就會生成一個html 錯誤頁面
  但是與ASP不同ASPNET格外關注的是要確保在默
  認狀態下不會因為這個錯誤的發生而洩露安全信息


  <systemweb> <customErrorsdefaultRedirect=urlmode=RemoteOn ly> <errorstatusCode=coderedirect=url></error> </customErrors> </systemweb>

  議程
錯誤類型以及處理方式
提高數據訪問性能
服務器控件的使用
緩存的使用
提高性能的實用技巧

性能引言

–XmlDocumentLoadXML(stringstrFileID) // 加
載XML
–boolCheckIDExisit(stringstrFileIDstringstrID)
//判斷節點是否存在
還是
–boolCheckIDExisitByXml(string strXmlstringstrID) //判斷節點是否存在
–或boolCheckIDExisitByXml(XmlDocumentobjXmlstringstrID) // 判斷節點是否存在

邏輯設計

建議: 采用層邏輯模型
– Pages (aspx) and User Controls (ascx) UI
– Business and Data Access classes in \bin dir
– Data within a SQL Database via SPROCs

使用最佳的Data Provider
ADONET 可支持多個Provider
–SystemDataSqlClient
–SystemDataOracleClient
–SystemDataOleDb
–SystemDataOdbc
所有Provider的編程模型相同
–但是性能方面存在明顯差異
建議使用最佳Provider
–在訪問MSDE/SQL 時始終使用SqlClient
–在訪問Oracle 時始終使用OracleClient

Data Provider測試
方案
–從SQL Northwinds 數據庫中抽取
–<%= %> html 表格格式化技術
衡量的三種技術(不同的Data Provider )
–傳統ASP/ADO
–ASPNET w/ SystemDataOleDb 提供商
–ASPNET w/ SystemDataSqlClient 提供商











傳統 ASP/ ADO 帶 OLEDB 的
ASPNET
帶 SQL 的 ASPNET
請求/秒(P 服務)
數據性能測試

DataReaders 和DataSets
DataReader
–對查詢的結果提供了單向讀取的操作
–輕量快速–但在Reader為關閉之前始終處於連接狀態
DataSet
–非鏈接的數據訪問方式
–內部使用DataReader用於獲取數據
–在完成DataSet的獲取後會自動關閉DataReader
如何選擇?
–依賴於您的應用
–般情況下讀取大量數據對返回數據不做大量處理用
SqlDataReader對返回數據大量處理用datset比較合

DataReader ?DataSet
通常情況下DataReader比
DataSet快%!!

ExecuteNonQuery和ExecuteScalar
ExecuteNonQuery
–對數據的更新不需要返回結果集
–由於不返回結果集可省掉網絡數據傳輸它僅僅返回受影響
的行數如果只需更新數據用ExecuteNonQuery性能的開銷
比較小
ExecuteScalar
–它只返回結果集中第一行的第一列使用ExecuteScalar 方
法從數據庫中檢索單個值(例如id號)
–與使用ExecuteReader 方法返回的數據執行生成單個值所
需的操作相比此操作需要的代碼較少
如何選擇?
–只需更新數據用ExecuteNonQuery單個值的查詢使用
ExecuteScalar

數據的綁定DataBinder
一般的綁定方法<%#
DataBinderEval(ContainerDataItem 字段名)
%>用DataBindereval 綁定不必關心數據來源
(Dataread或dataset)不必關心數據的類型eval
會把這個數據對象轉換為一個字符串在底層綁
定做了很多工作使用了反射性能正因為使用
方便了但卻影響了數據性能
直接轉換成DataRowView的話將會給性能帶來
很大提升
<@% ((DataRowView)ContainerDataItem)[
段名] %>

連接池
ADONET 擁有內置的連接池
–自動緩存/重新使用連接
–不必為此編寫任何代碼
代碼建議
在後期打開代碼中的連接然後在早期將其
關閉
–切勿長時間保持連接狀態
–完成後應立即顯示地關閉數據庫連接以將其返
回至池中

連接池
優化提示
–不同的連接字符串可以生成多個不同的連接池
–在WebConfig 中存儲單個連接字符串
–使用ConfigurationSettingsAppSettings以在運
行時采用編程形式對其進行訪問
始終應明確關閉數據連接避免連接洩漏
–否則連接將在下一次垃圾收集之前保持打開狀態
–洩露連接會顯著降低性能

使用存儲過程
建議將SPROC 用於數據存取
–通過DBA 進行更輕松的性能調試
–通過使用數據庫事務處理避免出現分布事務成本
–有助於防止SQL 注入攻擊
–有助於消除應用與數據庫反復調用的成本
有趣的提示
–可以通過企業管理器來關閉動態SQL 支持以強制使用
SPROC

DEMO
使用連接池優化程序

議程
錯誤類型以及處理方式
提高數據訪問性能
服務器控件的使用
緩存的使用
提高性能的實用技巧

  服務器控件
提供了清晰的編程模型(重用簡潔宜用)
–創建ASPNET 頁面所倡導的模式
對性能優化而言有兩點需要注意:
–ViewState
–控件數量

ViewState 管理

ASPNET controls 能夠維護頁面Control元素的狀態
– 狀態以viewstate hidden field進行傳遞
負面影響:
– 增加網絡負荷(both on render and postback)
– 額外的服務器性能消耗(serialize values to/from viewstate)
Viewstate靈活性:
– 頁面級(Can disable viewstateentirely for a page )
– 控件級(Can disable viewstateusage on a per control basis )
建議:
– 認真審核該功能的使用
– 若不使用PostBack功能請在頁面級屏蔽ViewState
– PostBack時每次都重新生成控件請對控件級的ViewState屏蔽
– 使用<%@ Page Trace=true %>跟蹤ViewState的大小

有關ViewState管理提示
如果您希望更明確的限制viewstate 的使用可將
ASPNET 配置為默認情況下處於關閉狀態
nfig
<configuration>
<systemweb>
<pages enableViewState=false/>
</systemweb>
</configuration>
之後需要viewstate 的頁將在頁面指令中手動對其進
行設置
–<%@ Page EnableViewState=true%>

生成的控件數量
頁面上的每個服務器控件的生成都存在固定的
成本
–每個控件的成本通常可以忽略不計
復合控件有時可以屏蔽使用的控件數量盡管
會出現以下情況
–聚集成本有時可以累加
–打開ASPNET Trace即可查看實際計數

議程
錯誤類型以及處理方式
提高數據訪問性能
服務器控件的使用
使用緩存進行程序優化
提高性能的實用技巧

緩存技術
什麼是緩存技術?
緩存是計算機快速地再次獲得數據地方式
緩存原理
將經常訪問地數據存儲到計算機可以更快
更容易地讀取地位置

ASPNET中緩存的位置
客戶端緩存
客戶
服務器
①從服務器讀取數據
②緩存到硬盤
③以後訪問讀取
硬盤數據

服務器緩存
服務器 ASPNET 引擎
ASPNET 引擎
客戶
③隨後的請求直接
從緩存中取數據
①從ASPNET 中發送數據
②緩存數據

什麼時候用緩存?
不要緩存用戶隨時都會
修改的對象如購物車
不要緩存包含時間的頁

緩存整個應用程序都要
使用的設置或對象(但
這些設置和對象必須在
其生存期內不變化)
不要緩存個人信息
防止別人盜用
緩存那些經常被訪問
並且變化不大的數據
不應該使用緩存的情況使用緩存的情況

如何使用緩存?
ASPNET有兩種用於WEB應用的緩沖技術
出緩沖和數據緩沖
–輸出緩沖指把一次請求所產生的動態輸出保存於內
存中
–數據緩沖指按照一定的策略把事先不確定的對象保
存於內存中
輸出緩存的使用
–使用@OutputCache指令
–例如(添加在頁頭)
<%@ OutputCacheDuration= VaryByParam=None%>

DEMO
輸出緩存練習

數據緩存
ASPNET提供了一個相當出色的緩存引擎
機制它允許頁面保存和索引HTTP請求所
要求的各種各樣的對象ASPNET的緩存
對各個應用來說是私有的是存儲各種對
象的存儲器緩存的生存周期取決於應用
的生存周期也就是說當應用重新啟動
緩存實際上也已重建

數據緩沖
–使用(類似於Session變量的使用)
Cache[userName] = MeMe;
ResponseWrite(Cache(userName));
–注意不能通過下標訪問緩存中的變量
ResponseWrite(Cache[]);是錯誤的
–緩存的刪除
CacheRemove(userName);

使用緩存依存關系
–緩存變量的添加
CacheAdd()
CacheInsert()
它們功能相同但Insert更加靈活一些
–Insert
(keyvaluedependenciesabsoluteExpiration
slidingExpirationprioritypriorityDecayonRem
oveCallBack)

緩存替換策略
腐爛搜索(Scavenging)
當內存變得比教緊張時緩存機制會找出最
不常用和最不重要的對象把它從內存中移
以減輕系統壓力
到期控制(Expiration)
編程者可以指定緩存對象的生存周期這種
指定的時間可以是絕對的也可以是相對的
文件和鍵值依賴
從外部文件或者是其他緩存鍵值是否改變
來決定本身鍵值是否有效

DEMO


數據緩存



議程
錯誤類型以及處理方式
提高數據訪問性能
服務器控件的使用
使用緩存進行程序優化
提高性能的實用技巧

提高性能的實用技巧
不要使用不必要的Session和ASP中一樣
在不必要的時候不要使用Session
不使用不必要的Server Control
不使用不必要的ViewState
不要用Exception控制程序流程
禁用VB和Jscript動態數據類型
使用存儲過程完成數據訪問
只讀數據訪問不要使用DataSet
關閉ASPNET的Debug模式
使用ASPNetOutput Cache 緩沖數據

提高性能的實用技巧
盡量用SQL返回DataGrid需要綁定的DataSet盡量不
要對DataSet進行二次加工特別不要對DataSet進
行大量刪除實踐證明這很慢不如復制部分數據
盡量把查詢數據的數據庫操作次數壓縮到最少盡量
次數據庫操作就可完成
注意優化數據庫查詢操作
不要在頁面加載時默認選擇全部數據盡管可以方便
後續操作但用戶會以為還沒有操作就這麼慢
建議盡量用比較高效的SQL代替後續復雜的DataSet
二次加工

提高性能的實用技巧
僅在需要的時候打開數據庫連接
一旦數據庫操作完畢一定關閉連接
在關閉連接時記得刪除臨時對象
在關閉連接前確保關閉任何用戶定義事務
顯示非交互性數據使用SQLDataReader可以獲得
最佳性能
注意共享那些經過復雜處理或漫長查詢才得到的數據
在頁面跳轉時記得終止當前頁面的處理
有大量連接的字符串操作不要使用+改用
StringBuilder


From:http://tw.wingwit.com/Article/program/net/201311/11632.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.