2010-07-16 45 views
3

我絕對不是WebForms的粉絲,我更喜歡.NET世界中的ASP.NET MVC。c#+ WebForms +靜態 - 最佳實踐是什麼?

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

我正在整合Korzh.com的EasyQuery.NET。以允許最終用戶基於預定義的模型創建他們自己的SQL查詢,使得用戶可以使用別名。

這是相關的,因爲科爾日的演示使用Global.asax模型和
查詢類與會話。

由於傳統的WebForms應用程序非常大,Global.asax在頁面特定項目中未使用

我的解決方案是使用私有靜態代替。靜態在桌面
應用程序中運行良好,但看起來至少在WebForms應用程序中可能導致一些麻煩。

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

問題:

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

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

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

P.S:我無法找到答案
通過谷歌或SO搜索。

回答

10

在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緩存的任何用戶相關。使用這些機制來共享共同的信息,例如配置,緩存等。會話可能是您希望以每個用戶爲基礎存儲事物的地方。如果您正在尋找一個每頁解決方案,它會更簡單,因爲您只需將變量作爲屬性或字段,將其作爲頁面結構本身的一部分。你只需要管理這些字段的初始化。

希望有所幫助。

+0

謝謝馬修 – gerryLowry 2010-07-16 14:35:13