KiMoGiGi 技术文集

不在乎选择什么,而在乎坚持多久……

IT博客 首页 联系 聚合 管理
  185 Posts :: 14 Stories :: 48 Comments :: 0 Trackbacks

原文
标题:ASP.NET Best Practices for High Performance Applications
作者:Ali Khan (OKC)
链接:http://www.codeproject.com/aspnet/ASPNET_Best_Practices.asp
翻译时间:2007-11-23



5. 小心使用session【Use session variables carefully】

避免在Session变量中存储大量的数据,确认你的Session超时是合理的。Session会消耗大量的服务器重要内存资源。记住,存储在Session的数据会在用户直接关掉浏览器后,还会存在相当的一段时间。太多的Session变量会把服务器弄垮。如果你在部分页面或程式不需要使用Session变量,应该禁用Session状态。

 

 1)禁用一个页面的Session状态,直接设置@ Page 的EnableSessionState 属性为false。如:
 <%@ Page EnableSessionState="false" %>
 2)如果你的页面只需要访问Session变量而不需要创建、修改它们,直接设置@ Page 的EnableSessionState 属性为ReadOnly。如:
 <%@ Page EnableSessionState="ReadOnly" %>  
 3)禁用服务器的所有程式使用Session,在Machine.config使用以下元素设置:
 <sessionState mode='Off'/>

6. 使用Server.Transfer【Use Server.Transfer】

在同一个应用程式中,使用Server.Transfer 方法重定向页面。

使用Server.Transfer这个语法,避免了不必要的客户端重定向。可以考虑使用Server.Transfer替代Response.Redirect。然而,你也不能总是使用Server.Transfer代替Response.Redirect 。如果你需要在重定向期间,做验证、授权处理,就必须使用Response.Redirect;因为这两种机制不相等。当你使用Response.Redirect,确认你使用了第二个参数为bool类型的重载版本,并传递false值,这样就可以确认内部的异常不会触发。同时,也要注意,你只能使用Server.Transfer 在同一个程式中,在页面定向间传递控件信息。如果要转页面到其他程式,必须使用Response.Redirect。

7.适当使用服务器控件,避免嵌套深层的控件。【Use server controls when appropriate and avoid creating deeply nested controls】

HTTP协议是无状态的;然而,服务器控件提供能强大的模型,使用了ViewState在管理页面间请求之间管理它的状态。没有免费的午餐,服务器控件需要一定数量的进程去建立自身控件和它的所有子控件。这一点,服务器控件对比HTML控件或静态的文本,相对地花费更多内存。当你不需要复杂的交互时,在用户界面使用一些内嵌服务器函数来替代服务器控件呈现界面。如果是以下条件,请替换服务器控件:

 1)你不需要在回传之间维护状态
 2)控件只负责静态输出数据,或者控件显示只读的数据
 3)不需要在服务器端编程访问控件

替换服务器控件方法可选择,简单rendering、HTML元素、用<%%>尖括弧内嵌调用 Response.Write。平衡你的选择是非常重要的。如果你的程式性能还可以接受,或者你对你程式的性能要求有限,那就避免过渡优化你的程式。

深层级嵌套的复合控件,需要花费一定的内存去建立自身控件和它的所有子控件。深层级结构导致创建额外的进程;这可使用html控件或使用更简单层次的服务器控件来避免。当你使用的控件如Repeater, DataList, 和 DataGrid 就要特别注意,因为他们将会在他们的容器中创建许多附加的子控件。

8.选择适合你的“检视”控件【Choose the data viewing control appropriate for your solution】

怎样选择如何在Web Form页面呈现数据,通常的重要依据是看便利和性能方面的权衡。在你选择使用控件之前,一定要对比一下他们的优劣之处。举例,你可以选择这三个控件(DataGrid, DataList 和 Repeater)去呈现数据,你的任务是找出哪个控件能提供给你最大的好处。DataGrid 可以用最快捷、最简单的方法去呈现数据,但通常来说它是最耗费性能的。在一些简单的案例中,用自动生成HTML可以完成列表工作,但用户定制需求和浏览器兼容(browser targeting?)所引发出来的额外工作很快就会抵消之前的快捷和便利。Repeater 控件是一个在便利和性能之间折中的服务器控件。它高效、可定制、可设计。


9. 优化代码和处理异常【Optimize code and exception handling】

在一些性能关键代码瓶颈中,使用For代替Foreach可以优化耗费性能的循环。也不要依赖你代码的异常或写一些代码能避免异常。每当发生异常而导致性能下降时,你应该不是用正常的程式流程去控制他们。尽可能的在代码检查有可能出现异常的地方。在处理这些条件之前,不要让他自己捕获异常。不要用异常去控制逻辑。如,数据库连接失败是一个异常,然而用户只是用户忘记输入密码,这种简单判断应该用条件作处理。常见的情景包括:检查是否为null;分配一个字符串而它将会被转化为数字;在应用数据运算符前,检测具体值是否符合要求。下面的例子演示导致异常的代码和使用条件判断的代码。两者运行的结果是相同的。

'不需要使用Exception
 Try
     value 
= 100 / number
Catch ex As Exception
    value 
= 0
End Try

' 推荐代码
If Not number = 0 Then
    value 
= 100 / number
Else
    value 
= 0
End If

检查null值。如果一个对象有可能为null,就检查确认它不为空;比直接抛出异常做法好。这通常会发生在,当我们要向ViewState、Session、Application或cache和query string 、form 的变量中获取值的时候。举例,不要使用以下的代码去访问Session的信息。

'不需要使用Exception
Try
value 
= HttpContext.Current.Session("Value").ToString
Catch ex As Exception
Response.Redirect(
"Main.aspx"False)
End Try
 
'推荐代码
If Not HttpContext.Current.Session("Value"Is Nothing Then
value 
= HttpContext.Current.Session("Value").ToString
Else
Response.Redirect(
"Main.aspx"False)
End If

10.使用DataReader会更快更高效地绑定数据【Use a DataReader for fast and efficient data binding】

如果你不需要缓存数据、或你只需呈现只读的数据、或者你只需要尽可能快速地加载数据到控件,你可以选择使用DataReader。DataReader 是在只向前读取数据中获取只读数据的最佳选择。加载数据到DataSet,然后绑定DataSet到控件,需要转移2次数据;你为了更好的性能,可以使用特殊的指定类型方法去获取数据。
posted on 2007-11-22 01:08 KiMoGiGi 阅读(478) 评论(0)  编辑 收藏 引用 所属分类: ASP.NET英文文章翻译
只有注册用户登录后才能发表评论。