2011-05-08 28 views
0

我有使用如何從不同的地方訪問同一個會話?

Session["Something"] = 1; 

的景色,我有一個類庫項目中一類試圖讓使用

HttpContext.Current.Session["Something"] 

會議此值,但它retuns null

public ActionResult Index() 
{ 
    Session["Something"] = 1; 
    var fromLib = (new MyLibClass()).GetSession("Something"); // null 
    var fromHere = Session["Something"]; // 1 
} 

// Class library project 
public object GetSession(string key) 
{ 
    return HttpContext.Current.Session[key]; 
} 

如何從會話中獲取值?或者有沒有辦法保存一個值並在另一個地方找回(沒有數據庫或系統文件)

+2

我可以問'GetSession()'實際上是什麼?如果你可以直接從'HttpContext.Current.Session()'訪問,那麼就不需要定製的方法來訪問它。 – 2011-05-08 21:33:48

+0

@rockin關鍵是它是一個非常簡單的例子,可以顯示問題所在。 – BrunoLM 2011-05-08 22:07:48

+0

在網絡應用程序之外使用會話是個不好的做法,主要是因爲它使單元測試變得非常困難。如果這僅僅是一個例子,考慮說明你真正想做什麼,所以我們可以建議一個替代方案,比如在你的類庫中緩存,或者把這個「會話」邏輯移動到Web層的某個地方。 – RPM1984 2011-05-08 23:45:44

回答

1

有兩會

Session (refers to the view session) 
HttpContext.Current.Session (refers to context session) 

使用HttpContext.Current.Session無處不在,因爲它們都是一樣的。我創建了一個課程來幫助我以我想要的方式訪問會話值,所以我可以直接調用它,而不用擔心正確的會話。

1

你不需要Session對象。

雖然Session有利於保持你可以實現自己的會話對象使用你的類庫具有重量輕,速度快,內部代碼內部的asp.net應用程序中的變量:

Dictionary<string, object> MySession = new Dictionary<string, object>(); 
MySession.Add("VariableName", myObject); 
MyLib.Pass(MySession); 

嘗試保持它更具體的,如果有可能,即如果你只是傳遞MyClass到庫中,然後:

Dictionary<string, MyClass> MySession = new Dictionary<string, MyClass>(); 
+0

但是,如何才能在Web應用程序和類庫之間共享?你公開嗎?線程安全呢? – RPM1984 2011-05-08 23:39:22

+0

在Web應用程序內部,您應該繼續使用會話對象作爲容器,但是在將參數傳遞給您的庫時,請使用您自己的。您需要更改一些庫來識別這個數據容器。如果您需要使其線程安全,請在更改和迭代它時使用內部'Dictionary'周圍的鎖。 – Xaqron 2011-05-09 11:38:42

相關問題