簡體   English   中英

Static Vs多用戶環境中的公共變量

[英]Static Vs Public variables in multiuser environment

我正在使用以下方法將全局變量保存在單獨的類文件中,以便它們可以在少數后端類中傳遞。 問題是當系統在多用戶環境中使用時失敗。 我無法選擇“會話”方法,因為管理員尚未准備好在SharePoint服務器上啟用會話狀態。

static class Global
{
        private static string id = string.Empty;
        public static string id
        {
            get { return id; }
            set { id = value; }
        }
}

如果我從上面的代碼中刪除靜態聲明,它會在多用戶場景中正常工作嗎? 如果不向服務器管理員尋求任何幫助,我還有哪些其他選擇。

不要將static用於每個用戶或每個請求的內容; static在Web應用程序中非常罕見,但有時可能會用於保存整個系統配置的快照(最好是不可變的)。

那么:我們在哪里可以存放東西?

會話狀態將是每個會話 (並且這里是線索)的明顯答案,但聽起來這不是一個選項

除此之外,你基本上有:http請求。 這意味着您可以訪問表單,查詢字符串和cookie。 就是這樣 您不希望在cookie中存儲太多內容:它會使每個請求都膨脹。 而“觀點狀態”只是邪惡的。 如果常規會話狀態不可行,你可以根據一些cookie(適當安全)做一些家庭釀造“會話”實現,但坦率地說,我認為你做得很好:

  • 如果您想要的只是一個id ,請使用請求表單/查詢字符串
  • 否則推動您的管理員啟用會話狀態

您的靜態變量將在所有用戶之間共享,並且不屬於特定用戶。 使用靜態變量來保持Web環境中的狀態幾乎總是一個壞主意。

如果您無法啟用會話狀態,那么一個好的策略是:

  • 將用戶特定標識符添加到URL,並將其保留在URL中
  • 根據該ID,將您的狀態保存在數據庫中的服務器上

這樣你基本上可以重新發明會話狀態; 但是你要避免全局啟用會話狀態。 如果狀態足夠小,您還可以將其編碼到URL中。

還要考慮Session狀態在服務器場環境中不能正常工作,除非您將其存儲在共享服務器上 - 這可能是您的管理員不傾向於啟用它的原因。

在Web場或Web園環境中,靜態更糟糕,SharePoint支持得非常好。 靜態字段是每個AppDomain 這意味着,例如,它們對於一台機器內的一個工作進程中的所有用戶都是相同的,但是在工作進程之間和機器之間將是不同的。

不要在多用戶應用程序中使用靜態,並且您不必擔心環境更改時的行為更改。

如果確實需要會話狀態,請啟用會話狀態。 就這么簡單。

但是,如果您只需要幾個(輕量級)會話變量,則可以使用cookie,並在每個請求上來回傳輸數據。

您還可以嘗試使用以下內容“重新實現”會話狀態:

static class Globals
{
   private static Dictionary<string, MySessionObjectType> sessions;

   public static MySessionObjectType GetSessionData(string SessionID){...}

   public static void SetSessionData
                         (string SessionID, MySessionObjectType sessionData){...}
}

當然,這不會擴展到多個Web服務器,管理會話超時將是PITA。

不要忘記網絡本身的性質是無狀態的,因此使用太多狀態(無論是在服務器上還是在客戶端上)並不總是明智的選擇。

暫無
暫無

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

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