2010-11-18 65 views
1

我有一個問題。我在我的項目中構建了包含公共靜態屬性ctx和assitingn HttpContext.Current對象的自定義類。在運行時,該屬性似乎引用HttpContext對象,但ctx.Session類爲null。當我調試我的應用程序時,表達式(ctx)的左側與右側(HttpContext.Current)不完全相同。爲什麼發生這種情況?ASP.NET MVC HttpContext.Session對象

素不相識

回答

1

HttpContext.Current僅適用於請求的單例。通過將HttpContext.Current賦值給一個靜態變量,你可以將這個HttpContext.Current分享給整個範圍,這可能是不對的。

會話是每個用戶對象,而靜態是應用程序範圍的對象。明智地使用靜態。

-1

我會做的就是這樣。

1-提供當前httpcontext的靜態類(例如:ContextFactory)。如果它有HttpContext.Current,則提供該值,如果不是,則它提供一個指定的上下文。在你的情況,new Mock<HttpContextBase>();

public static class ContextFactory 
{ 
    private static HttpContextBase current = null; 

    public static HttpContextBase Current 
    { 
     get { return current ?? HttpContext.Current; } 
     set { current = value; } 
    } 
} 

2 - 然後,我改變代碼UserSess到

public static class UserSess 
{ 
    public static UserID 
    { 
     get { return ContextFactory.Current.Session["UserID"]; } 
     set { ContextFactory.Current.Session["UserID"] = value; } 
    } 
    //... 
} 

真誠

+0

不要存儲會話(=每個用戶的不同)在一個靜態變量(=的每個用戶都一樣)!您可以看到, – 2011-12-05 09:56:11

+0

會話不存儲在靜態類中,除非用戶設置它(必須在測試中完成)。如果未設置,它將返回CURRENT http上下文和CORRECT會話。 – edokan 2011-12-27 13:42:41

+0

對不起,我錯過了 – 2012-01-06 08:19:06