2011-01-17 7 views
3

私はHttpContext.Current.Session現在のユーザーに格納しています、SiteUserは現在アクティブなsiteuserを提示し、シングルトーンのクラスで、彼がログインしたときに、私は(新しいSiteUserを作成しています)コントローラでとコンストラクタでセッションに彼を追加:HttpContext.Current.Sessionヌル項目

public static SiteUser Create() 
{ 
    HttpContext.Current.Session[sessionKey] = new SiteUser(); 

    return HttpContext.Current.Session[sessionKey] as SiteUser; 
} 

、その後、私はチェックがセッションで使用可能なユーザーですよサーバーサービスへのすべての要求に:

public static SiteUser Current 
{ 
    get 
    { 
     if (HttpContext.Current.Session == null || HttpContext.Current.Session[sessionKey] == null) 
     { 
      throw new SiteUserAutorizationExeption(); 
     } 

     return HttpContext.Current.Session[sessionKey] as SiteUser; 
    } 
} 

そうでない場合、私は非auth-を生成していますユーザーの例外をログオンページにリダイレクトします。 HttpContext.Current.Session [sessionKey]はnullですが、HttpContext.Current.SessionはnullでなくFormsAuthenticationTicketが使用可能で、Expiredプロパティもfalseです。 誰かが私を助けることができる、なぜHttpContext.Current.Session [sessionKey]がnullになることができますか?

UPD:WebConfigのセッションの設定:<sessionState mode="InProc" timeout="20" />

UPD:SESSIONKEYがある:public const string sessionKey = "SiteUser";

UPD2:私はセッションでも、文化の設定を保存することを、追加することを忘れている:

HttpContext.Current.Session["Culture"] 

と例外ヒット、HttpContext.Current.Sesことシオンは、[SESSIONKEY]文化アイテム、nullでUPD3

ではありません:私はソースの.NET Frameworkのシンボルテーブルをダウンロードし、コレクションアイテムを変更するにSessionStateItemCollectionにブレークポイントを設定しています。原因でweb.configファイルのセッションタイムアウトで、セッション終了イベント で、私はそれができる方法を理解することはできませんが起こる)「文化」 2の後に設定される - nullの 1)すべてのコレクションアイテム:と私はいくつかのミスを解消しましたSESSIONKEYを変更することができる20

+0

メモリ内セッションですか?またはデータベースに永続化するように設定されていますか?また:おそらくIISは、アプリケーションプールをリサイクルですか? –

+0

mmm ..私はInProcセッションモードを使用しています、それはセッションがメモリ内にあることを意味していますか? IISは、おそらくアプリプールをリサイクルしている - 私はわからない、現在私はdevのサーバーがリサイクルされますしていないのasp.net開発サーバー – Boo

+0

で実行していない - それはあなたの問題を解決しましたIISの事 –

答えて

6

を設定し、あなたはおそらく唯一実行する必要がされています

HttpContext.Current.Session["CurrentUser"] 

またはセッションがタイムアウトをチェックし、期限切れにすることができる。

http://msdn.microsoft.com/en-us/library/h6bb9cz9(VS.71).aspx

または、セッションの値を別の場所から設定している可能性があります。通常は、1つのプロパティでSession/Contextオブジェクトへのアクセスを制御します。

static readonly string SESSION_CurrentUser = "CurrentUser"; 

public static SiteUser Create() {  
SiteUser.Current = new SiteUser();  
return SiteUser.Current; 
} 

public static SiteUser Current {  
get {   
    if (HttpContext.Current.Session == null || HttpContext.Current.Session[SESSION_CurrentUser] == null) {    
    throw new SiteUserAutorizationExeption();   
    }   
    return HttpContext.Current.Session[SESSION_CurrentUser] as SiteUser;  
} 
set { 
    if (!HttpContext.Current.Session == null) { 
    HttpContext.Current.Session[SESSION_CurrentUser] = value; 
    } 
} 
} 
+0

はい、私のsessionKeyはconst文字列値です。これについての情報をトピックに追加することを忘れてしまいます。私はプロパティに設定しようとします、これは良いアイデアです、ありがとう – Boo

関連する問題