asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET错误处理和程序优化


发布日期:2021年06月18日
 
ASP.NET错误处理和程序优化
议程

错误类型以及处理方式

提高数据访问性能

服务器控件的使用

缓存的使用

提高性能的实用技巧

错误类型以及处理方式

错误的类型

分析程序错误

–语法错误语法有问题

–逻辑错误错误类型不匹配不正确输出

使用不正确的对象处理无效的数据

编译错误使用了不能被语言编译器识别

但ASPNET能识别的关键字或语句时发生的

错误

运行时错误

配置错误nfig文件出错

错误的处理

使用验证控件

编程处理

–校验语句

校验(checked)和非校验(unchecked)语句

–trycatchfinallytry{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=RemoteOnly><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

               

上一篇:在ASP.NET页面中实现数据棒图

下一篇:ASP.NET MVC雕虫小技 1-2