摘要
。错误类型以及处理方式
。提高数据访问性能
。服务器控件的使用
。缓存的使用
。提高性能的实用技巧

*错误类型以及处理方式
1、错误的类型
。分析程序错误
-语法错误:语法有问题
-逻辑错误:除0错误,类型不匹配,不正确输出,使用不正确的对象,处理无效的数据。
。编译错误:使用了不能被语言编译器识别,但ASP.NET能识别的关键字或语句时发生的错误
。运行时错误
。配置错误:Web.config文件出错

2、错语的处理
。使用验证控件
。编程处理
-校验语句
-try...catch...finally
-Page_Error
-Application_Error
。在应用程序配置文件中,为应用程序执行的声明性错误处理。

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

*异常类:Exception
。所有异常对象的基类
。属性:
-HelpLink:到一个文件的链接,该文件包含关于错误的更详细的信息
-InnerException:一个内部异常的引用。如果一个异常被捕获,并被传递给另外一个异常处理程序,则该属性返回到第一个异常的引用。
-Message:描述异常的引用
-Source:一个字符串,其中包含引起错误的对象的名称。
-StackTrace:返回一个指出错误原因的栈跟踪
-TrageSite:引起错误的方法。

*Page对象的Error事件
。使用模板
void Page_Error(object sender,EventArgs e)
{
 Response.Write("发生错误:"+Server.GetLastError().ToString());
 Server.ClearError();
}

*Application对象的Error事件
。应用程序中任何页面抛出异常都会调用
。在global.asax中
。形式为:
void Application_Error(object sender,EventArgs e)
{
......
}

*利用配置文件处理错误
。ASP.NET同以前的ASP一样,当服务器上发生了一个运行时间或编译时间错误时,就全生成一个html错误页面。但是与ASP不同,ASP.NET格外

关注的是:要确保在默认状态下,不会因为这个错误的发生而泄露“安全”信息。

<system.web>
 <customErrors defaultRedirect="url" mode="RemoteOnly">
  <error statusCode="code" redirect="url"></error>
 </customErrors>
<?system.web>

*提高数据访问性能
使用最佳的Data Provider:
-System.Data.SqlClient
-System.Data.OracleClient
-System.Data.OleDb
-System.Data.Odbc

。所有Provider的编程模型相同
-但是性能方面存在明显差异

。建议:使用最佳Provider
-在访问MSDE/SQL时始终使用SqlClient
-在访问Oracle时始终使用OracleClient

*DataReaders和DataSets
.DataReader
-对查询的结果提供了单向读取的操作
-轻量快速-但在Reader为关闭之前始终处于连接状态
.DataSet
-非链接的数据访问方式
-内部使用DataReader用于获取数据
-在完成DataSet的获取后会自动关闭DataReader
.如何选择?
-依赖于您的应用
-一般情况下,读取大量数据,对返回数据不做大量处理用sqlDataReader,对返回数据大理处理用DataSet比较合适。

.ExecuteNonQuery和ExecuteScalar
.ExecuteNonQuery
-对数据的更新不需要返回结果集
-由于不返回结果集可省掉网络数据传输。它仅仅返回受影响的行数。如果只需要新数据用ExecuteNonQuery性能的开销比较少。
.ExecuteScalar
-它只返回结果集中第一行的第一列。使用ExecuteScalar方法从数据库中检索单个值(例如ID号)。
-与使用ExecuteReader方法,返回的数据执行生成单个值所需的操作相比,此操作需要的代码较少。
.如何选择?
-只需要更新数据用ExecuteNonQuery.单个值的查询使用ExecuteScalar

*数据的绑定DataBinder
。一般的绑定方法<%#DataBinder.Eval(Container.DataItem,"字段名")%>用DataBinder.Eval绑定不必关心数据来源(DataRead或DataSet)

。不必关心数据的类型Eval会把这个数据对象转换为一个字符串。在底层绑定做了很多工作,使用了反射性能。正因为使用方便了,但却影响

了数据性能。
。直接转换成DataRowView的话,将会给性能带画很大提升:
<@%((DataRowView)Container.DataItem)["字段名"]%>

*连接池
。ADO.NEt拥有内置的连接池
-自动缓存/重新使用连接
-不必为此编写任何代码

。代码建议:
-“在后期打开代码中的连接,然后在早期将其关闭”
-切勿长时间保持连接状态
-完成后应立即显示地关闭数据库连接,以将其返回至池中。

。优化提示:
-不同的连接字符串可以生成多个不同的连接池
-在Web.Config中存储单个连接字符串
-使用ConfigurationManager.ConnectionStrings["名称"].ConnectionString,以在运行时采用编程形式对其进行访问
。始终应明确关闭数据连接,避免连接泄漏
-否则连接将在下一次垃圾收集之胶保持打开状态
-泄露连接会显著降低性能。

*使用存储过程
。建议将SPROC用于数据存取
-通过使用数据库事务处理避免出现分存事务成本
-有助于防止SQL注入攻击
-有助于消除应用与数据库反复调用的成本
。有趣的提示:
-可以通过企业管理器来关闭动态SQL支持,以强制使用SPROC

*服务器控件的使用
。提供了清晰的编程模型(重用,简洁,宜用)
-创建ASP.NET页面所倡导的模式
。对性能优化而言有两点需要注意工:
-ViewState
-控件数量

*ViewState管理
。ASP.NET Controls能够维护页面Control元素的状态
-状态以"ViewState hidden filed"进行传递
。负面影响
-增加网络负荷(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的使用,可将ASP.NET配置为默认情况下处于关闭状态
。Machine.config
<configuration>
 <System.Web>
  <Page enableViewState="false" />
 </System.Web>
</configuration>

。之后需要ViewState的页将在页面指令中手动对其进行设置:
<%@ Page EnableViewState="true" %>

*生成的控件数量
。页面上的每个服务器控件的生成都存在固定的成本。
-每个控件的成本通常可以忽略不计
。复合控件有进可以屏蔽使用的控件数量,尽管会出现以下情况
-聚集成本有时可以累加
-打开ASP.NET Trace即可查看实际计数

*使用缓存进行程序优化
1、什么是缓存技术?
缓存是计算机快速地再次获得数据的方式。
2、缓存原理
将经常访问地数据存储到计算机可以更快,更容易地读取地位置。

4、什么时候用缓存?
*使用缓存的情况
。缓存那些经常被访问、并且变化不大的数据
。缓存整个应用程序都要使用的设置或对象(但这些设置和对象必段在其生存期内不变化)
*不应该使用缓存的情况
。不要缓存个人信息,以防止别人盗用。
。不要缓存包含时间的页面
。不要缓存用户随时都会修改的对象,如购物车。

5、如何使用缓存?
。ASP.NET有两种用于Web应用的缓存技术:输出缓存和数据缓存。
-输出缓存指:把一次请求所产生的动态输出保存于内存中。
-数据缓存指:按照一定的策略把事先不确定的对象保存于内存中。
。输出缓存的使用
-使用@OutputCache指令
-例如(添加在页头)
<%@ OutputCache Duration="10" VaryByParam="None" %>

数据缓存
。ASP.NET提供了一个相当出色的缓存引擎机制,它允许页面保存和索引HTTP请求所要求的各种各样的对象。ASP.NET的缓存对各个应用来说是

私有的,是存储各种对象的存储器。缓存的生存周期取决于应用的生存周期,也就是说,当应用重新启动时,缓存实际上也已重建。
。数据缓存
-使用(类似于Session变量的使用)
Cache["UserName"]="MiMi";
Response.Write(Cache("UserName"));
-注意不能通过下标访问缓存中的变量,如Respose.Write(Cache[0]);j 错误的。
-缓存的删除
Cache.Remove("UserName");
。使用缓存依存关系
-缓存变量的添加
。Cache.Add();
。Cache.Insert();
它们功能相同,但Insert更加灵活一些
-Insert(key,value,dependencies,absoluteExpiration,slidingExpiration,priority,priorityDecay,onRemoveCallBack)

。缓存替换策略
1、“腐烂搜索”(Scavenging)
。当内郹变得比较紧张时,缓存机制会找出最不常用和最不重要的对象,把它从内在中移出,以减轻系统压力。
2、“到期控制”(Expiration)
。编程者可以指定缓存对象的生存周期,这种指定的时间可以是绝对的也可以是相对的。
3、“文件和键值依赖”
。从外部文件或者是其它缓存键值是否改变,来决定本身键值是否有效。

*提高性能的实用技巧
。不要使用不必要的Session,和ASP中一样,在不必要的时候不要使用Session
。不使用不必要的server Control
。不使用不必要的ViewState
。不要用Exception控制程序流程
。禁用VB和Jscript动态数据类型
。使用存储过程完成数据访问
。只读数据访问不要使用DataSet
。关闭ASP.NET和Debug模式
。使用ASP.NET Output Cache缓存数据
。尽量用SQL返回DataGrid需要绑定的DataSet,尽量不要对DataSet进行二次加工,特别不要对DataSet进行大量删除,实践证明这样很慢。不如复制部分数据。
。尽量把查询数据的数据库操作次数压缩到最少,尽量1-2次数据库操作就可以完成。
。注意优数据库查询操作。
。不要在页面加载时默认选择全部数据,尽管可以方便后续操作,但用户会以为“还没有操作就这么慢”
。建议尽量用比较高效的SQL代替后续复杂的DataSet二次加工。
。仅在需要的时候打开数据库连接
。一旦数据库操作完毕,一定关闭连接
。在关闭连接时记得删除临时对象
。在关闭连接前,确保关闭任何用户定义事务
。显示非交互性数据,使用SQLDataReader可以获得最佳性能。
。注意共享那些经过复杂处理或漫长查询才得到的数据
。在页面跳转时记得终止当前页面的处理。
。有大量连接的字符串操作不要使用+,改用StringBuilder

转载于:https://www.cnblogs.com/iceberg2008/archive/2009/03/23/1419776.html

第十三讲 ASP.NET中的错误处理和程序优化相关推荐

  1. 使用Global.asax在ASP.NET中记录错误日志

    完整的Glabal.asax代码: <%@ Application Language="C#" %> <script RunAt="server&quo ...

  2. ASP.NET中 分析器错误:发现不明确的匹配

    这是一个不好的代码习惯引起的发布后运行时的问题.错误原因为.net2.0无法正确识别服务器控件和变量的大小写区别,但是这个错误只有在iis中体现,在文件系统的调试中没有发生. 错误信息 引发错误的参考 ...

  3. asp.net 中的错误处理

    在web.config中,可以指定,处理一般错误与指定错误的页面 <customErrors mode="On" defaultRedirect="GenericE ...

  4. java中获取错误,在简单程序中获取分段错误

    我在学校放假期间一直在教自己C,并且最近尝试编写一个简单的计算器程序,该程序应该采用两个整数并对它们执行四个操作之一( - * /),但每当第一个变量被赋值时,我得到分段错误/核心转储错误消息 . 我 ...

  5. ASP.NET Core 中的错误处理

    1.前言 ASP.NET Core处理错误环境区分为两种:开发环境和非开发环境. ●开发环境:开发人员异常页. ●非开发环境:异常处理程序页.状态代码页. 在Startup.Configure方法里面 ...

  6. 在ASP.NET Web API中返回错误的最佳实践

    本文翻译自:Best practice to return errors in ASP.NET Web API I have concerns on the way that we returns e ...

  7. ASP.NET中/应用程序中的服务器错误的方法

    ASP.NET中"/"应用程序中的服务器错误 在ASP.Net中新建了网站项目,敲了基本的代码框架测试数据的链接信息. 下面是我在DAL层的代码片段. namespace DAL ...

  8. asp中出现“错误 '80040e14' FROM 子句语法错误”原因

    当你的sql语句中出现 "错误 '80040e14' FROM 子句语法错误."错误时,请注意了,那有可能是你的表名的命名不规范造成的,比如你的表名是"user" ...

  9. ASP.NET 网站发布后出现“/”应用程序中的服务器错误

    这里先简单的说明下造成此错误的原因,我们将网站发布到IIS上的时候,是需要选择和设置应用程序池,如果新发布网站所设置的应用程序池已经有其他网站使用了,那么就会出现抛出System.InvalidOpe ...

最新文章

  1. Ubuntu server中静态IP配置
  2. 三线压力传感器原理_电喷摩托车进气压力传感器原理与检测
  3. 调用虚拟内存编译时的error处理
  4. Android 反编译Apk修改资源文件并重新打包
  5. 【超图+CESIUM】【基础API使用示例】48、超图|CESIUM - 漫游飞行效果
  6. 获取下载Qt安装包,Qt源码全国网址备忘录(不用注册Qt账户,即可下载各版本Qt安装包和Qt源码包)
  7. Android 免费云真机
  8. 2021抖音上热门技巧有哪些?
  9. python中如何显示特殊的单位符号
  10. iPhone、iPad尺寸
  11. 操作系统概述(发展,特性,功能)
  12. 将某个GitLab上的项目同步到另一个GitLab
  13. 使用Feed43为网页生成RSS订阅源
  14. 在windows7上搭建STF
  15. 英语总结——新的开始
  16. HG Plugins 1.0 For JQuery
  17. 无线网卡丢失的两个奇葩解决办法
  18. c++擦除mbr代码
  19. 大家快点帮我,帮我,bt3使用时出了点问题
  20. 卡巴斯基:移动MM的新榜样

热门文章

  1. vue2.0-基于elementui换肤[自定义主题]
  2. tastypie使用cache对list data无效问题
  3. Domino下实现仿Google搜索提示效果
  4. Ajax(从json中提取数据)
  5. PAT1021. 个位数统计
  6. 2d游戏引擎_8年,从2D到3D,我的学习之路
  7. canoe变量和信号_CANoe的经验总结及如何进行 CAN Signal layout
  8. foobar2000隐藏桌面悬浮窗头像_多多情侣头像大全app-多多情侣头像大全软件v1.0.1...
  9. 如何判断过拟合和欠拟合
  10. python第三方库介绍和安装