簡體   English   中英

c#+ WebForms + static - 最佳實踐是什么?

[英]c# + WebForms + static — what are the best practices?

我絕對不是WebForms的粉絲,我更喜歡.NET世界的ASP.NET MVC。

無論如何,我正在研究一個非常大的遺留WebForms應用程序的一小部分。

我正在整合Korzh.com的EasyQuery.NET。 允許最終用戶根據預定義的模型創建自己的SQL查詢,使用戶友好的別名。

這是相關的,因為Korzh的演示使用Global.asax作為其模型和
查詢類和Session。

因為遺留的WebForms應用程序非常大,所以沒有使用Global.asax
用於頁面特定項目。

我的解決方案是使用私有靜態。 靜態在桌面上運行良好
應用程序,但似乎至少可能導致WebForms應用程序的一些悲傷。

我發現了!IsPostBack不太可靠,在我看來
在WebForms中,最佳實踐可能是使用Session。 這個問題
會話是它似乎通過HTML傳遞給客戶端並且可以增長
非常大的千字節。

問題:

由於靜態變量與WebForms一起使用時駐留在IIS服務器上,因此WebForms應用程序的每個用戶是否共享相同的靜態變量地址空間? (我認為答案是肯定的)。

在ASP.NET WebForms應用程序中使用/不使用靜態變量的最佳實踐/指南是什么?

謝謝。
問候,
格里(洛瑞)

PS:我找不到答案
通過Google或搜索SO。

在ASP.NET中,靜態實例將在應用程序的生命周期中存在,即Web應用程序本身,直到它被回收或關閉,例如:

public class Global : HttpApplication {
    public static string MyString
}

因此,對應用程序的所有請求都可以訪問靜態屬性。 不是存儲頁面特定項目的地方。 有很多可用的存儲機制:

  1. HttpRuntime.Cache和HttpContext.Cache都指向相同的緩存實例,並且在應用程序的生命周期中存在項目(因此與靜態實例具有相同的問題)。

  2. HttpContext.Items,特定於請求的項目集合。 對應用程序發出的每個請求都有自己的項目集合。

  3. HttpSessionState會話,持續用戶訪問的長度,或者每當超時時。 這可以通過4種方式配置:

    3.A. 在InProc中,會話對象由工作進程本身存儲在內存中。 快速訪問緩存,不需要序列化,但如果應用程序循環使用,會話數據將丟失。

    3.B. SqlServer,會話對象被序列化並存儲在Sql Server數據庫中。 要求所有會話存儲的項目都是可序列化的。 即使應用程序循環使用,會話對象仍然存在。

    3.C. StateServer,會話對象存儲在單獨的進程中,並通過應用程序循環來保存數據。

    3.D. 自定義會話提供商,這取決於你....

  4. ViewState,這是將數據持久保存到客戶端並發回服務器以重建頁面視圖之間的控制狀態的位置。

我會避免使用靜態實例和HttpRuntime緩存來處理與用戶相關的任何事情。 將這些機制用於共享的公共信息,例如配置,緩存等。會話可能是您希望按用戶存儲內容的地方。 如果您正在尋找每頁解決方案,那么它更簡單,因為您只需將變量本身作為屬性或字段的一部分。 您只需管理這些字段的初始化。

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM