我有一组多用户的ASP.NET网页。页面使用AJAX更新面板,因此我可以避免在每次回发时更新屏幕。
每页的生命周期如下:
1.在Page_Load期间,从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)如果我清除静态,我是否会冒另一个用户丢失数据的风险?
我已经重写了删除静态,保留const值并将我需要的数据作为参数传递。在我需要保存更新数据的地方,我在session []变量中保留了我需要的最小数量。
答案 0 :(得分:3)
A)否 - 如果第二个用户打开一个页面而另一个用户忙,会发生什么?静态数据集将被第二个用户的数据覆盖,或者您的静态数据集是否以某种方式同时区分不同用户的数据?
B)如果你绝对必须使用静态/服务器端数据,那么是的,你应该以某种方式清除它们。但是,保证发生这种情况很困难。 (例如,如果一个用户只是关闭他们的浏览器)
C)可能,但如果这是一个问题,那么我在A)中的问题已经会给你带来更大的问题。
作为一般答案,将大量数据存储在服务器的内存中通常是不好的做法。它不能很好地扩展,并为许多不同类型的错误打开了你。您的后端应该是无状态的,并且您可以通过多种方式实现这一点,例如将记录存储在DB中的单独表中,该表仅在最终确定(并因此移入“真实”表中)你有几个屏幕的结尾。
答案 1 :(得分:1)
直接回答您的问题,无需打开一堆蠕虫
A)几乎没有更糟糕的方式来实现数据捕获 B)在.NET中将变量设置为null会使不清除内存 C)是的,是的,你这样做。根据定义,每个用户共享相同的静态数据。
答案 2 :(得分:1)
我会将您的服务停留在本地,并且只对常量使用全局变量。通过在全球范围内声明它们,你不会节省太多。另外,我会使用const字符串而不是静态字符串。
答案 3 :(得分:1)
我认为其他人已经回答了你的问题。我建议帮助修复您的代码将是执行以下操作:
m_PersonID
不应该是静态的 - 将它保留为页面的实例属性/字段并将其设置为静态。实际上,代码背后的类级变量可以很快地将其自身用于相当难以理解的代码。它确实需要是类级别的,还是可以在需要它的方法中定义(并且可能只是作为参数传递给其他方法)?m_ServiceResult
- 同样的。不知道你为什么拥有它,它不需要是静态的。尝试将其移动到方法级变量。m_SortExpression
可能只是一个const m_Service
- 再次,我认为不需要这是静态的。如果它只是服务的代理,我认为您不需要将其保留在内存中以避免不必要的开销。我认为保持静态的问题远远超过使服务客户端成为方法级变量的小开销。简而言之,转储静态并尽可能转移到私有的方法级变量。尝试减少从数据库返回的数据量。考虑采用参数而不是使用类级和/或全局变量的方法。
我希望这会有所帮助。祝你好运!