Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET网页中存储数据的最佳做法_C#_Asp.net - Fatal编程技术网

C# 在ASP.NET网页中存储数据的最佳做法

C# 在ASP.NET网页中存储数据的最佳做法,c#,asp.net,C#,Asp.net,我有一套多用户的ASP.NET网页。这些页面使用AJAX更新面板,因此我可以避免在每次回发时更新屏幕。 每个页面的生命周期如下: 1.在页面加载期间,从web服务获取用户的相关数据。 2.将数据(相当大)和服务引用存储在静态数据集中。 3.允许通过屏幕控件(网格、文本框)对部分数据进行各种编辑 4.验证通过表单捕获的数据 5.将更新的数据发送回服务 我使用Page类本身中的静态变量来完成此操作,如下所示: public partial class MyPage : System.Web.UI.P

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

我使用Page类本身中的静态变量来完成此操作,如下所示:

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来清除内存?
C) 如果我清除了静态数据,我是否会冒其他用户丢失数据的风险

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

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

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

C) 可能,但如果这是一个问题,那么我在a)中的问题将给你带来更大的问题


一般来说,在服务器的内存中存储大量数据通常是不好的做法。它不能很好地扩展,并且会导致许多不同类型的错误。您的后端应该是无状态的,您可以通过多种方式实现这一点,例如,将记录存储在数据库中的一个单独的表中,这些记录只会在您拥有的几个屏幕的末尾完成(从而移动到“真实”表中)。

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

A) 实现数据捕获几乎没有比这更糟糕的方法了
B) 在.NET中将变量设置为null不会清除内存。

C) 是的,是的。根据定义,每个用户共享相同的静态数据

我会让您的服务增量保持本地,并且只对常量使用全局变量。通过在全球范围内声明它们,您不会节省很多钱。另外,我会使用常量字符串而不是静态字符串。

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

  • m_PersonID
    不应是静态的-将其保留为页面的实例属性/字段,并将其作为静态的。事实上,代码隐藏中的类级变量可以很快地将自己用于相当不可读的代码。它是否真的需要是类级的,或者可以在需要它的方法中定义它(并且可能只是作为参数传递给其他方法)
  • m_servicesult
    -此项相同。不知道为什么会有它,它不需要是静态的。尝试将其移动到方法级别变量
  • m_SortExpression
    可能只是一个常量
  • m_服务
    -同样,我不认为这需要是静态的。如果它只是服务的代理,我认为您不需要将其保存在内存中以避免不必要的开销。我认为,保持静态的问题远远超过了让服务客户机成为方法级变量的小开销
  • 对于静态数据集,如果数据对于用户来说是相当静态的,则可能需要考虑缓存大结果集。或者,如果您真的需要所有这些数据,请查看您返回的内容并进行评估。如果您在代码隐藏中执行计算,那么这可能不是最好的地方。考虑你的服务层作为这些计算的地方(或者如果你在存储的进程中有很多逻辑),不要说这是它的位置,而只是承认它是可能的。
  • 此外,数据集相当大和庞大。您需要这种结构,还是一组流线型实体对象更合适?这一项与#5非常相似,因为您确实应该评估如何检索数据、存储数据以及如何处理数据。数据集可能是快速而肮脏的答案,但通常不是有效的答案
  • 简言之,尽可能转储静态并移动到私有的方法级变量。尽量减少从数据库返回的数据量。考虑采取参数而不是使用类级别和/或全局变量的方法。< /P>
    我希望这有帮助。祝你好运

    您意识到,使用静态数据,访问此页面的两个用户正在查看/编辑相同的数据,对吗?假设两个用户同时编辑来自不同线程的相同静态数据。您可能想从这里开始:数据存储m_ServiceResult包含许多字段,这些字段对处理很重要,但在任何标记中都不应该对用户可见。由于我不想在以后的页面中看到这些数据,我将研究使用ViewState而不是会话。谢谢。静态字符串是这样的,我可以在运行时更改排序过滤器,但从阅读注释到目前为止,我似乎已经实现了这一点非常糟糕,只适合单个用户。谢谢。我有很多用户看不到的数据项,因此没有使用隐藏字段。在数据库中使用临时表似乎有些过分;但是,我承认我当前的实现不适合多用户。如果您真的想要廉价的解决方案,请查看Session对象。它将允许您拥有每个用户的“静态”数据,尽管我应该为e