[英]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 字符串。
我想其他人已經回答了你的問題。 我幫助修復代碼的建議是執行以下一些操作:
m_PersonID
不應為 static - 將其保留為頁面的實例屬性/字段並將其作為 static。 事實上,代碼背后的類級變量可以很快地變成相當不可讀的代碼。 它真的需要是類級別的,還是可以在您需要它的方法中定義(並且可能只是作為參數傳遞給其他方法)?m_ServiceResult
- 與此相同。 不知道你為什么擁有它,它不需要是 static。 嘗試將其移至方法級變量。m_SortExpression
可能只是一個常量m_Service
- 再一次,我不認為它需要成為 static。 如果它只是服務的代理,我認為您不需要將其保存在 memory 以避免不必要的開銷。 我認為他們保留它的問題 static 遠遠超過讓服務客戶端成為方法級變量的小開銷。簡而言之,盡可能轉儲靜態變量並轉移到私有的方法級變量。 嘗試減少從數據庫返回的數據量。 考慮采用參數而不是使用類級別和/或全局變量的方法。
我希望這有幫助。 祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.