65.9K
CodeProject 正在变化。 阅读更多。
Home

提高性能和可伸缩性的一些最佳实践

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.71/5 (11投票s)

2005年11月30日

4分钟阅读

viewsIcon

24665

本文详细介绍了一些提高性能和可伸缩性的最佳实践。

引言

本文介绍了提高应用程序性能和可伸缩性的方法。

使用代码

Session

备注(来自 MSDN)

此属性提供有关当前请求的会话的信息。对于请求 ASP.NET 应用程序的页面或文档的每个用户,都会维护一个 Session 对象。存储在 Session 对象中的变量在用户在应用程序中从一个页面移到另一个页面时不会被丢弃;相反,只要用户正在访问您的应用程序中的页面,这些变量就会持续存在。

备注(来自本人)

Session 对象非常强大,但使用不当也可能非常危险。我将在下面解释原因。

Session 变量的常见用途
Session["UserID"] = this.txtUserID.Text; 
Session["Password"] = this.txtPassword.Text; 
Session["Age"] = this.txtAge.Text; 
Session["Name"] = this.txtNameID.Text; 
Session["LastName"] = this.txtLastName.Text; 
Session["PhoneNumber"] = this.txtPhoneNumber.Text; 
Session["Email"] = this.txtEmail.Text;

现在,我的问题是,如果你有很多页面,你就会不知道在哪里使用了/创建了 session 变量。不知不觉中,你会为相同的信息创建另一个变量,现在你就有了两个 session 变量存储相同的信息。你在其他页面创建更多 session 变量,依此类推。现在你的 session 变量到处都是,消耗着你的资源。

我的解决方案
public class MySessionInfo 
{ 
    public string UserID; 
    public string Password; 
    public string Age; 
    public string Name; 
    public string LastName;
    public string PhoneNumber; 
    public string Email; 
}

我的解决方案是创建一个类来存储所有必需的信息,并将该类的单个对象存储在 session 中。这样,你就确切地知道 session 中存储了什么!如果有多位开发人员同时在一个项目上工作,这也很有帮助。他们可以查看你是否已经有一个 session 变量来存储特定信息,这样他们就不会创建重复项。当 tôi 解释我的基类时,你会看到如何轻松地访问 session。

基类 (System.Web.UI.Page)

备注(来自 MSDN)

System.Web.UI.Page 表示从承载 ASP.NET Web 应用程序的服务器请求的 .aspx 文件,也称为 Web Forms 页面。

继承

除了用户控件,您还可以使用继承作为一种技术来扩展 ASP.NET 移动 Web 应用程序的功能。如果创建一个继承自现有 ASP.NET 移动控件类的类,则可以通过重写现有成员或为新类创建新属性、方法和事件来添加额外功能。

备注(来自本人)

许多新的(ASP.NET)开发人员实际上并没有考虑使用继承。我将要做的是创建一个基类,然后让我的页面继承我的基类。这样做的好处是可以在一个类中管理所有全局变量。缺点是您需要在设计时查看页面之前编译该类。

标准继承
public class WebForm1 : System.Web.UI.Page
我的继承
public class WebForm1 : MyBasePage
public class MyBasePage : System.Web.UI.Page 
{ 
    public MySessionInfo CurrentUserSession 
    { 
        get 
       { 
             if (Session["MySessionInfo"] == null) 
                 Session["MySessionInfo"] = new MySessionInfo(); 
             return Session["MySessionInfo"] as MySessionInfo; 
       } 
       set 
       { 
           Session["MySessionInfo"] = value; 
        }  
}

在上面的代码中,您可以看到我使用了我创建的 session 对象。

public class WebForm1 : MyBasePage
{
     private void Page_Load(object sender, System.EventArgs e)
     {
         this.CurrentUserSession.UserID = "NewUser"; 
     }
}
public class WebForm2 : MyBasePage
{
     private void Page_Load(object sender, System.EventArgs e)
     {
         this.txtUserID.Text = this.CurrentUserSession.UserID
     }
}

您可以看到我只在基类中创建了一个 session 变量。由于我继承自我的基类,我可以使用 session,而无需键入 Session[""]。在我的基类中,我还创建了一个 OpenConnection() 方法,该方法返回一个已打开的 DataConnection 对象,以及一个 CloseConnection() 方法,该方法关闭 DataConnection 并处理该对象。

public class MyBasePage : System.Web.UI.Page 
{ 
    protected System.Data.SqlClient.SqlConnection connection; 
    public System.Data.SqlClient.SqlConnection OpenConnection() 
    { 
        if (connection == null) 
            connection = 
             new System.Data.SqlClient.SqlConnection("myConnectionString"); 
        if (connection.State != System.Data.ConnectionState.Open) 
            connection.Open(); 
        return connection; 
    } 
    public void CloseConnection() 
    { 
        if (connection != null) 
        { 
            if (this.connection.State != 
                System.Data.ConnectionState.Closed) 
            { 
                this.connection.Close(); 
                this.connection.Dispose(); 
            } 
        } 
    } 
}

使用此功能的一个示例

public class WebForm2 : MyBasePage
{
     private void Page_Load(object sender, System.EventArgs e)
     {
         System.Data.SqlClient.SqlCommand Command = 
                new System.Data.SqlClient.SqlCommand();
         Command.Connection = this.OpenConnection();
         //Do Somthing

         this.CloseConnection();
         this.Command.Dispose();

     }
}

您可以使用基类做更多的事情。例如:如果您想在每页上写日期,只需在基类的 Onload 方法中完成,您的所有页面都将自动显示日期。现在可以在一个地方进行验证,所有继承自基类的页面都自动具有验证功能。

Session 和跳转到新页面

备注(来自 MSDN)

您可能希望将用户从一个 Web Forms 页面重定向到另一个页面。您可以这样做来显示与用户浏览器功能匹配的页面,或者显示用用户所说语言编写的页面。有两种方法可以重定向页面。

  • 使用服务器端方法。

    在这种情况下,服务器只是将上下文转移到另一个页面。好处是可以共享页面之间的页面上下文信息。缺点是用户的浏览器不知道这次转移,因此浏览器的历史记录没有更新。如果用户刷新页面,可能会出现意外结果。

  • 使用浏览器。

    在这种情况下,您向用户的浏览器发送一个命令,该命令会导致浏览器获取另一个页面。好处是浏览器的历史记录得到了更新。缺点是这种情况会执行额外的往返,这会影响性能。Context.Handler 封装了关于单个 HTTP 请求的所有 HTTP 特定信息。

备注(来自本人)

很多人这样做的方式是:如果你想进行一次跳转,比如说从浏览屏幕到更新屏幕,开发人员会将选定的行存储在 session 中,然后重定向/跳转到另一个页面,然后打开 session。你实际上不需要将信息存储在 session 中。你可以将其传输到另一个页面。注意:这个技巧只有在使用 Transfer 方法时才有效。

public class WebForm1 : MyBasePage
{
     public string MyValue;
     private void Page_Load(object sender, System.EventArgs e)
     {
         Myvalue = "This is a Value From WebForm1";
         Server.Transfer("WebForm2.aspx");
     }
}
public class WebForm2 : MyBasePage
{
     private void Page_Load(object sender, System.EventArgs e)
     {
         this.txtMyValue.Text = ((WebForm1)Context.Handler).MyValue;

     }
}

最后

这里有一篇您可能感兴趣的好文章

© . All rights reserved.