繁体   English   中英

在 ASP.NET web 页面中存储数据的最佳实践

[英]Best Practice for storing data in an ASP.NET web page

我有一组多用户 ASP.NET web 页面。 这些页面使用 AJAX 更新面板,因此我可以避免在每次回发时更新屏幕。 每个页面的生命周期如下:
1. 在Page_Load期间,从web服务中获取用户的相关数据。
2. 将数据(相当大)和服务引用存储在 static 数据集中。
3. 允许通过屏幕控制(网格、文本框)对部分数据进行各种编辑
4. 验证通过表单捕获的数据
5. 将更新的数据发送回服务

我正在使用页面 class 本身中的 static 变量执行此操作,如下所示:

public partial class MyPage : System.Web.UI.Page
{
    static xxxx.DataCaptureServiceClient  m_Service; //reference to web service
    static string m_PersonID = string.Empty;  //current person_id page is viewing
    static ServResponse m_ServiceResult = null;        // reference to our data to edit ( ServResponse is a large data contract)   
    static string m_SortExpression = "Reference"; //default sort expression for grid

    const int PERSONID_COLUMN = 0;        //column index in grid for the personID column
    const int STATUS_COLUMN = 4;          //column index in grid for the application status

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (!Page.IsPostBack)
            {
                // Get new service instance.
                m_Service = new xxxx.DataCaptureServiceClient();

                ShowDataOnPage(); //get data in m_ServiceResult and bind to a grid on screen
            }
        }
        catch (Exception ex)
        {
            Response.Redirect("ErrorPage.aspx", false);
        }
    }

    protected void butNext_Click(object sender, EventArgs e)
    {
        try
        {
            Page.Validate();

            if (Page.IsValid)
            {
                // Use m_ServiceResult and m_Service to send a packaged submission to the service.
                SendDatatoService();
                Response.Redirect("TheNextPage.aspx", false);

            }
        }
        catch (Exception ex)
        {
           Response.Redirect("ErrorPage.aspx", false);
        }
}

//Other methods which allow edits to m_ServiceResult

我想知道是否:

A)这是一个很好的实施方式还是有更好的做法?
B)当我重定向到另一个页面时,我是否应该通过将所有静态设置为 NULL 来清除 memory?
C) 如果我清除静态数据,我是否会冒另一个用户丢失数据的风险?

更新

我重写了删除静态变量,保留常量值并将我需要的数据作为参数传递。 在我需要保留更新数据的地方,我在 session[] 变量中保留了我需要的最少数量。

A) 否 - 如果第二个用户在另一个用户忙时打开一个页面会发生什么? static 数据集将被第二个用户的数据覆盖,或者您的 static 数据集是否以某种方式同时区分不同用户的数据?

B)如果您绝对必须使用静态/服务器端数据,那么是的,您应该以某种方式清除它们。 然而,要保证这种情况发生是很困难的。 (例如,如果一个用户只是关闭了他们的浏览器)

C)可能,但如果这是一个问题,那么我在 A)中的问题已经会给你带来更大的问题。

作为一般答案,在服务器上的 memory 中存储大量数据通常是不好的做法。 它不能很好地扩展,并为您打开许多不同类型的错误。 您的后端应该是无状态的,并且有多种方法可以实现这一点,例如将记录存储在数据库中的单独表中,该表仅在结束您拥有的几个屏幕。

直接回答您的问题,无需打开一罐蠕虫

A) 实现数据捕获几乎没有比这更糟糕的方法了
B) 在 .NET 中将变量设置为 null不会清除 memory。
C) 是的,是的。 根据定义,每个用户都共享相同的 static 数据。

我会将您的服务声明保留在本地,并且仅将全局变量用于常量。 通过在全球范围内声明它们并没有节省太多。 另外,我会使用 const 字符串而不是 static 字符串。

我想其他人已经回答了你的问题。 我帮助修复代码的建议是执行以下一些操作:

  1. m_PersonID不应为 static - 将其保留为页面的实例属性/字段并将其作为 static。 事实上,代码背后的类级变量可以很快地变成相当不可读的代码。 它真的需要是类级别的,还是可以在您需要它的方法中定义(并且可能只是作为参数传递给其他方法)?
  2. m_ServiceResult - 与此相同。 不知道你为什么拥有它,它不需要是 static。 尝试将其移至方法级变量。
  3. m_SortExpression可能只是一个常量
  4. m_Service - 再一次,我不认为它需要成为 static。 如果它只是服务的代理,我认为您不需要将其保存在 memory 以避免不必要的开销。 我认为他们保留它的问题 static 远远超过让服务客户端成为方法级变量的小开销。
  5. 关于 static 数据集,如果数据对用户来说相当 static,您可能需要考虑缓存大型结果集。 或者,真正看看您返回的内容并评估您是否真的需要所有这些数据。 如果您在代码隐藏中执行计算,那可能不是最好的地方。 将您的服务层视为进行这些计算的地方(如果您在存储过程中有很多逻辑,则将其视为数据库 - 并不是说这是它的地方,而只是承认这是一种可能性)。
  6. 此外,数据集非常庞大且庞大。 你需要这种结构,还是一组精简的实体对象更合适? 这个项目与#5 差不多,因为你真的应该评估你是如何检索数据、存储数据并对其采取行动的。 数据集可能是快速而肮脏的答案,但通常不是有效的答案。

简而言之,尽可能转储静态变量并转移到私有的方法级变量。 尝试减少从数据库返回的数据量。 考虑采用参数而不是使用类级别和/或全局变量的方法。

我希望这有帮助。 祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM