2011-02-15 120 views
6

當用戶登錄時,我想他的用戶ID存儲在會話與存儲用戶ID

HttpContext.Current.Session["UserID"] = 2354; (this is just a hard-coded example) 

然後,當我運行一個頁面的方法,如果我做

var test = HttpContext.Current.Session["UserID"]; 

變量測試會保存我登錄時存儲的值嗎?

如果這是做到這一點的正確方法,當我從頁面方法接收呼叫時如何訪問會話?我想將test = ...行放在頁面方法中,以確定請求來自哪個用戶。

謝謝。

+1

這就是那裏的會話 - 跨頁面請求保存數據,所以...是的。 – 2011-02-15 21:47:28

+0

問題是,當我在頁面方法中放置斷點時,我得到\t \t會話[「UserID」] \t非靜態字段,方法或屬性'System.Web.UI.Page .Session.get' – frenchie 2011-02-15 21:51:22

回答

3

如已經回答了,是的 - 它應該是罰款,但如果你使用這種方法[的WebMethod]它將無法調用服務之前坐在一個頁面上太久。在這種情況下,最佳做法是檢查會議並根據需要重建。對於任何其他身份驗證來說,也是如此,以確保它們沒有變得不同步或過期。

[WebMethod(EnableSession = true)] 

    HttpContext context = HttpContext.Current; 
    if (context.Session["UserID"] == null) { 
     Utilites.PopulateSessionVars(context.Request.ClientCertificate, context.Request.ServerVariables["REMOTE_ADDR"]); 
    } 
    String userId = context.Session["UserID"].ToString(); 

(其中Utilities.PopulateSessionVars是重建關閉無論你使用的登錄......這在我的情況是PKI證書的會話數據的方法)

0

是的,但建議您在test變量賦值後直接進行測試,以確保在您嘗試使用它之前正確設置了UserID。

編輯

你可以嘗試:

var test; 

if (HttpContext.Current.Session["UserID"] != null) 
{ 
    test = HttpContext.Current.Session["UserID"]; 
} 
+0

問題是,當我在頁面方法中放置斷點時,我得到Session [「UserID」] \t非靜態字段,方法或屬性'System.Web需要對象引用。 UI.Page.Session.get' – frenchie 2011-02-15 21:51:40

0

是的,這應該工作。但是,會話和表單身份驗證超時位於不同的計時器上,並且具有不同的默認超時值,因此如果使用表單身份驗證,則無法保證會話中的值在用戶通過身份驗證的時間段內可用。

0

這應該這樣做

//Note: this code hasn't been tested. Correct me if I'm wrong 

//To Set: 
if (Session["UserId"] == null) 
    Session["UserId"] = "12345"; 

//To Get it: 
if (Session["UserId"] != null) 
    MyObject.Id = Session["UsedId"].ToString(); 
+0

目前,我只想在會話中使用硬編碼的用戶標識。所以在global.asax文件中,我有Session [「UsedID」] = 6;但是,這是行不通的。 – frenchie 2011-02-15 21:55:44

0

運行的Global.asax在應用程序級別。你想要的用戶會話是一個不同的http上下文。改爲在家庭/默認登錄頁面初始化會話。