2013-04-12 35 views
3

在Web項目訪問公共靜態變量在Global.asax.cs中遇到了問題,我已經定義在的global.asax.cs公共靜態變量(店),需要在整個可訪問應用程序。使用HttpContext.Current(C#)

public class Global : HttpApplication 
{ 
    public static UserDataStore Store; 

    void Application_Start(object sender, EventArgs e) 
    { 
     Store = new UserDataStore(); 
     Store.CurrentUsers = new Hashtable(); 
    } 

    void Session_Start(object sender, EventArgs e) 
    { 
     if (!Store.UserExists(HttpContext.Current.Session.SessionID)) 
      Store.AddUser(HttpContext.Current.Session.SessionID, "StubUser"); 
    } 
} 

我需要訪問它不能引用Web項目的另一個項目(和它的全局對象),因爲它會導致循環引用。

我的工作,圍繞爲是試圖使用HttpApplication對象檢索商店:

UserDataStore udStore = (UserDataStore) HttpContext.Current.Application["Store"]; 

這將編譯,但返回一個空對象。

我已經走了谷歌盲試圖找到這樣的其他例子,但大多數的什麼我發現信奉的2種方法之一:

  1. 使用應用程序(「」)的變量,這是子 - 最優,並根據本文用於傳統的ASP兼容性:http://support.microsoft.com/kb/312607
  2. 通過Web項目的全球一流的,這是不是在我們的當前設置的選項訪問。

這似乎應該是可能的,所以希望我失去了一些愚蠢的事。

任何幫助,你可以提供將不勝感激。謝謝。

+0

不宜應用[ 「」]在該範圍是相同的HttpContext.Current.Application?你在哪裏分配?即:HttpContext.Current.Application [「Store」] = Store。 – LouD

回答

3

製作與共享數據的第三(庫)項目,並從兩者的其他項目中引用它。

+0

我確實將UserDataStore類移到了第三個項目中,因爲它在Web項目中。但是我們仍然想在Global.asax.cs中使用Application/Session Start/End事件。 Slo UserDataStore對象的存儲應保持在那裏。 –

+1

@Chris Cline:爲什麼?你似乎對自己施加了一個奇怪的限制。例如,你可以在UserDataStore本身擁有一個靜態屬性,並且只需從global.asax訪問它即可。僅僅因爲你在global.asax中使用它並不意味着你必須在那裏定義持有字段。 – spender

+1

我能說什麼?我喜歡奇怪的約束。 但嚴重的是,我接受了您的建議並相應地重構了我們的代碼。目前看來目前運作順利。謝謝! –

1

申請的「」]應該是相同HttpContext.Current.Application。你記得增加那個價值嗎?你可以從你的Application_Start調用其中的任何一個。

Application["Store"] = Store 

HttpContext.Current.Application["Store"] = Store 
相關問題