性能微调提示
任何编程模型都有常见的性能缺陷,ASP.NET 也不例外。本节描述一些可避免在代码中出现性能瓶颈的方法。
1.在未使用时禁用会话状态: 并非所有的应用程序或页都要求基于每个用户的会话状态。如果不需要,可将其完全禁用。这可以通过以下页级别指令轻松实现:
<%@ Page EnableSessionState="false" %>
注意:如果页需要访问会话变量但不创建或修改它们,请将指令值设置为 ReadOnly。还可为 XML Web 服务方法禁用会话状态。请参阅 XML Web 服务一节中的使用对象和内部对象。
2.慎重选择会话状态提供程序: ASP.NET 为存储应用程序的会话数据提供了三种不同的方法:进程内会话状态、作为 Windows 服务的进程外会话状态和 SQL 数据库中的进程外会话状态。每种方法都有自己的优点,但进程内会话状态是迄今为止速度最快的解决方案。如果仅在会话状态中存储少量易失数据,则应使用进程内提供程序。进程外解决方案主要用于 Web 花园和 Web 农场方案,或用于当服务器/进程重新启动时不能丢失数据的情况。
3.避免与服务器间的过多往返行程:Web 窗体页框架是 ASP.NET 的最佳功能之一,因为它可以显著减少为完成某项任务所需编写的代码量。使用服务器控件和回发事件处理模型的页元素编程访问无疑是最省时的功能。但是,对这些功能的使用存在着适当和不适当的方法,了解何时使用它们是适当的很重要。
应用程序通常仅在检索数据或存储数据时才需要往返于服务器。多数数据操作可在往返行程间在客户端进行。例如在用户提交数据前,通常可以在客户端验证窗体项。通常,如果不需要将信息中继回服务器,则不应往返于服务器。
如果编写自己的服务器控件,请考虑让它们为上级(支持 ECMAScript)浏览器呈现客户端代码。通过采用“智能”控件,可显著减少对 Web 服务器的不必要点击次数。
4.使用 Page.IsPostback 避免往返行程上的额外工作:如果处理服务器控件回发,通常需要在第一次请求页时执行代码,该代码不同于激发事件时用于往返行程的代码。如果检查 Page.IsPostBack 属性,则代码可按条件执行,具体取决于是否有对页的初始请求或对服务器控件事件的响应。这样做似乎很明显,但实际上可以忽略此项检查而不更改页的行为。例如:
<script language="C#" runat="server">
public DataSet ds;
...
void Page_Load(Object sender, EventArgs e) {
// ...set up a connection and command here...
if (!Page.IsPostBack) {
String query = "select * from Authors where FirstName like '%JUSTIN%'";
myCommand.Fill(ds, "Authors");
myDataGrid.DataBind();
}
}
void Button_Click(Object sender, EventArgs e) {
String query = "select * from Authors where FirstName like '%BRAD%'";
myCommand.Fill(ds, "Authors");
myDataGrid.DataBind();
}
</script>
<form runat="server">
<asp:datagrid datasource='<%# ds.DefaultView %>' runat="server"/><br>
<asp:button onclick="Button_Click" runat="server"/>
</form>
<script language="VB" runat="server">
Public ds As DataSet
...
Sub Page_Load(sender As Object, e As EventArgs)
' ...set up a connection and command here...
If Not (Page.IsPostBack)
Dim query As String = "select * from Authors where FirstName like '%JUSTIN%'"
myCommand.Fill(ds, "Authors")
myDataGrid.DataBind()
End If
End Sub
Sub Button_Click(sender As Object, e As EventArgs)
Dim query As String = "select * from Authors where FirstName like '%BRAD%'"
myCommand.Fill(ds, "Authors")
myDataGrid.DataBind()
End Sub
</script>
<form runat="server">
<asp:datagrid datasource='<%# ds.Tables["Authors"].DefaultView %>' runat="server"/><br>
<asp:button onclick="Button_Click" runat="server"/>
</form>
<script language="JScript" runat="server">
public var ds:DataSet;
...
function Page_Load(sender:Object, e:EventArgs) : void {
// ...set up a connection and command here...
if (!Page.IsPostBack) {
var query:String = "select * from Authors where FirstName like '%JUSTIN%'";
myCommand.Fill(ds, "Authors");
myDataGrid.DataBind();
}
}
function Button_Click(sender:Object, e:EventArgs) : void {
var query:String = "select * from Authors where FirstName like '%BRAD%'";
myCommand.Fill(ds, "Authors");
myDataGrid.DataBind();
}
</