2011-07-11 11 views
4

SQL Serverを使用してセッション状態を格納するASP.NETアプリケーションがあります。 )これ以外の場合は特に問題はありません。SQLを使用してセッションを保存するときのセッション状態の接続エラーを検出するにはどうすればよいですか?

データベースサーバはサードパーティによってホストされており、定期的にSQLサーバのメンテナンスを行います。この場合、コードでdb接続エラーを正常に検出し、メンテナンス中のメッセージを表示することができます。各リクエストとともに実行され、Entity Frameworkコンテナのインスタンスをインスタンス化するHttpModuleを作成しました。インスタンス化が何らかの理由で失敗した場合、接続の問題があることがわかっており、ユーザーをメンテナンスページにリダイレクトします。

これは、セッション状態サーバーの設定を有効にするまで有効です。セッション状態は、このモジュールが実行される前に接続文字列にアクセスします。次に、セッション状態に対して醜い接続エラーが発生します。

どうすればこのエラーを検出できますか?アプリケーションにセッション状態の接続エラーをキャッチ/検出し、「インプロセス」セッション状態に切り替える場所がありますか?

答えて

10

Application_ErrorメソッドのエラーをGlobal.asaxにキャッチするだけで済みます。このような何かが動作しますが、例外がSession関連の例外であるかどうかを確認したい場合があります。残念ながら、ASP.NETはSessionExceptionをスローしません。HttpExceptionSqlExceptionをラップします。 Maintenance.aspx

protected void Application_Error() 
{ 
    Response.Clear(); 
    var ex = Server.GetLastError(); 
    if (ex is HttpException && 
     ex.Message.Contains("Unable to connect to SQL Server session database")) 
    { 
     Server.Transfer("/Maintenance.aspx"); 
    } 
    else 
    { 
     Response.Write("Other error occurred."); 
     Response.Write(ex.ToString()); 
     Response.End(); 
    } 
} 

あなたはfalseEnableSessionStateページディレクティブを設定してください。 Server.Transferを使用すると、セッションモジュールがこの要求に対して再度実行されず、別の例外が発生するのを防ぐことができます。

EDIT

は少しテストをした、とのセッションが動作していない場合には、テストするには、以下のチェックを使用する方が良いでしょう:

if (ex is HttpException && Context.Session == null) 

または可能性だけでも:

if (Context.Session == null) 

Context.Sessionは、セッションモジュールが失敗した場合は常にnullにする必要があります(残念ながら、そのアサーションをサポートしますが、私のテストではそうでした)。

+0

メンテナンスページは実際には.htmlページなので、セッションは問題ではありません。答えをありがとう。私はこれを開いたままにして誰かが入力を持っているかどうかを確認しますが、そうでなければこの午後の午後を受け入れます。ありがとうrsbarro :) – Chev

+0

私は助けることができる嬉しい、うれしい。 – rsbarro

+0

これは、サーバーにアクセスできない場合に接続エラーを検出するのに役立ちました。文脈に関しては、それは私にとってはうまくいかないようです。ありがとう – Pimenta

関連する問題