簡體   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