2011-01-27 15 views
22

セッションがタイムアウトしたときにユーザーにサインアウトします。だから、Global.asaxの中で、次のコードを使用:Session_Endは起動しませんか?

protected void Session_End(object sender, EventArgs e) 
{ 
    FormsAuthentication.SignOut(); 
} 

しかしsession_endは発火しませんようです。どのようにそれを修正することができる任意のアイデア?私はデフォルト設定でASP.NETを使用しています。

+3

から呼び出し、このあなたが本当に解雇するイベントにそのための20分を待っていましたか? – leppie

+0

@leppie:間違いなくはい!私はまた、この行を次のように置き換えました: "throw new exception(" ");"それでも動作しません。 –

+0

@InSane:これをどうすれば保証できますか?私は特定の時間の後にセッションが本当に切れることを知っています。だから、それはInProcだと思われます –

答えて

34

あなたはSESSION_STARTで、いくつかのセッションデータを設定することがあります。これがなければ、Session_Endは起動されません。 はまた、ここで注意すべきもう一つの非常に重要なことは、あなたがセッションに何かを保存しない場合のSession_Endイベントは発生しませんということですthis

参照してください。 Session_Endイベントが発生するためには、一度少なくともセッションに保存されたものがなければなりません。これは、最初のリクエストでセッションに何かを保存し、同じリクエストでセッションを放棄しても、Sesison_Endイベントは発生しないことを意味します。

+4

これは受け入れられる回答でなければなりません –

+0

非常に興味深い;私が知らなかった何か。また、多くの意味があります。 IMHO、これが答えです。 – nocarrier

+0

私はDubyaに同意します。 –

1

それは決して発砲しないのですか?

Session_Endは、クライアントからの最後の要求が到着した後にタイムアウトでASP.NETセッションが終了するため、現在の要求とは何の関係もありません。 FormsAuthenticaion.SignOutへの呼び出しは、認証Cookieを操作するため、クライアント(ブラウザ)からの接続がなくても効果はありません。

は(答えを持っている)、この質問を見てみましょう - 問題はあなたに、多かれ少なかれ似ていますが、適切なソリューションを見つけるかもしれないので:

Session_End in Global.asax.cs not firing using forms authentication

・ホープ、このことができますし。あなたが私にはわからない要素

<configuration> 
    <system.web> 
      <sessionState mode="InProc" /> 
      ..... 
    </system.web> 
</configuration> 
5

、それが機能やバグです。または、私はASP.NETで十分なセッション管理を理解できない場合があります。しかし、これは私が見つけたものです。

Session_Startが宣言されていない場合、Session_EndはASP.NET MVC 4で起動しません(web.configのsessionState要素のデフォルト設定)。

だからのSession_EndをキャッチするSESSION_STARTを宣言必要:)

protected void Session_Start(Object sender, EventArgs e) { } 

protected void Session_End(Object sender, EventArgs e) { 
    Debug.WriteLine("End. " + Session.SessionID); 
} 
+1

です。また、Session_EndはInProc以外のsessionStateでは動作しません。 – Phill

+0

セッションをInProcに変更しました。しかし、session_endはまだ起動しません。 –

+3

IISまたはVisual Studioでこれを実行していますか?Visual StudioでWebDevを使用している場合は、イベントが発生しません。これをテストするには、WebサイトをIISに配置し、w3wp.exe – Phill

5

の子としててsessionState要素を持っている必要があり、あなたのweb.configファイルで

+1

ありがとうございます。 –

0

私はその動作を知っていませんが、タイムアウト後にブラウザを閉じると起動します。

public void Session_End(Object sender, SessionEndedEventArgs e) 
    { 
    } 

Application_Start() Event 

    SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End); 
関連する問題