トップ回答者
すべてのイベントでタイムアウトを判定するには

質問
-
お世話になってます。
現在ASP.net + C#.net + SQLServer2008で開発を行っています。
IISのタイムアウトを60分に設定していまして、それを過ぎると自動的にログアウトされてしまう仕組みに成っています。
最近気づいたのですが、
データベースの更新処理を行う際、
ページ表示
↓(60分過ぎる)
タイムアウトする
↓
イベント起きる
↓
コミットされる
↓
ページ表示 ←ここでタイムアウト?こんな流れで、データベースの処理が終わった後にタイムアウト担っている気がします。
pageloadにログアウトするように書いているので当然と言えば当然ですが・・・・・
ここで質問なのですが、ボタンを押した瞬間にタイムアウトの判定をする事ってできるのでしょうか?
もしくはウェブアプリケーションの中で起きるイベントをすべて管理しているようなクラスは用意されているのでしょうか?
よろしくお願いします。
回答
-
ここで質問なのですが、ボタンを押した瞬間にタイムアウトの判定をする事ってできるのでしょうか?
タイムアウトしているということはセッションが失われていますので、新たにセッションがスタートするかどうかが判断の一つになります。全体にご質問の内容が伝わってこないのですが、タイムアウトしていたらタイムアウトしたという画面を表示されたいのでしょうか? であれば、以下が参考になるかもしれません。
(参考)
ASP.NET、FORMS認証タイムアウト時の動作。
http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/94661d64-cb8c-4b1f-92ee-8cd8c9284ff5
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
先に、タイムアウトの判定はできないと思うと書きましたが、認証チケット
を調べれば、タイムアウトの判定は可能でした。HttpApplication.BeginRequest または FormsAuthenticationModule.Authenticate
イベントで認証クッキーを取得し、その Value を復号して認証チケットを
取得できます。ただし、認証チケットが期限切れの場合、FormsAuthenticationModule で認
証クッキーを削除しているようで、HttpApplication.AuthenticateRequest
以降では取得できませんのでご注意ください。- 回答としてマーク 山本春海 2010年4月30日 9:34
すべての返信
-
ここで質問なのですが、ボタンを押した瞬間にタイムアウトの判定をする事ってできるのでしょうか?
タイムアウトしているということはセッションが失われていますので、新たにセッションがスタートするかどうかが判断の一つになります。全体にご質問の内容が伝わってこないのですが、タイムアウトしていたらタイムアウトしたという画面を表示されたいのでしょうか? であれば、以下が参考になるかもしれません。
(参考)
ASP.NET、FORMS認証タイムアウト時の動作。
http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/94661d64-cb8c-4b1f-92ee-8cd8c9284ff5
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
ASP.NET Forms 認証で timeout を 60 分に設定してあり、ユーザ
ーがログインしてデータベースの更新処理を要求し、その処理に
60 分以上かかった後、ブラウザに応答を返すという状況ですか?> タイムアウトする
> ↓
> イベント起きる
> ↓
> コミットされる
> ↓
> ページ表示 ←ここでタイムアウト?そうであれば、「タイムアウトする」= 認証チケットが期限切
れになるということだけで、イベントは発生していないはずです。「ページ表示」のところでは、すでに認証チケットはタイムアウ
トしているはずですが、それを検出して中断するような実装はさ
れてないので、ページが表示される以外なにも起こらないという
ことではないかと思います。> ここで質問なのですが、ボタンを押した瞬間にタイムアウトの判
> 定をする事ってできるのでしょうか?「ボタンを押した瞬間」というのはログインページにリダイレクト
される前にという意味ですか?タイムアウトの判定ではなくて、そのユーザーが有効な認証チケッ
トを持っているか否かの判定なら、未検証ですが、Global.asax に
Application_AuthorizeRequest ハンドラを実装してできそうな気
がします。> もしくはウェブアプリケーションの中で起きるイベントをすべて
> 管理しているようなクラスは用意されているのでしょうか?自分が知る限りですが、ないと思います。(そもそも認証チケット
の有効期限切れでイベントは発生しないし・・・)目的が、要求からある時間経ったら処理を中断してユーザーにタイ
ムアウトを知らせたいということなら、タイマーを使って出来るの
ではないでしょうか? -
>ASP.NET Forms 認証で timeout を 60 分に設定してあり、ユーザ
>ーがログインしてデータベースの更新処理を要求し、その処理に
>60 分以上かかった後、ブラウザに応答を返すという状況ですか?いえ 処理に60分かかるのではなく、例えば60分以上席を外してしまうような状況をさしています。
席を外して60分たって席に戻ってボタンを押したときにイベントを発生させたくないのです。
タイムアウト後にログインページにリダイレクトする処理はpageloadに記載しています。
質問の意図は、例えばイベントが走る前にタイムアウトしているかどうかを判定したいのです。
開発環境で試したところ、イベントが走った後にpageloadでタイムアウトかどうか見ていました。
うまく表現が出来ずに申し訳ありません・・・・・・
-
すみません、レスがよく理解できません。ASP.NET Forms 認証の話
ですよね?> 席を外して60分たって席に戻ってボタンを押したときにイベント
> を発生させたくないのです。イベントとは Button.Click のことですか? そのページに匿名ア
クセスを許してなければ、デフォルトの設定では login.aspx ペー
ジにリダイレクトされるはずです(Button.Click イベントは発生
しません)。login.aspx ページでログインすると、元のページに
リダイレクトされますが、Button.Click イベントは発生しないは
ずです。(自分が検証した限りそうでした)> タイムアウト後にログインページにリダイレクトする処理はpageload
> に記載しています。その意味が分かりません、web.config の forms 要素で loginUrl
をログインページに設定しておけば、コードは一行も書かずにログ
インページにリダイレクトされます。それが普通のやりかただと思
いますが。> 質問の意図は、例えばイベントが走る前にタイムアウトしている
> かどうかを判定したいのです。先にも述べましたが、Button.Click イベントは発生しないはずです。
login.aspx にリダイレクトされる前に、ユーザーが有効な認証チケッ
トを持っているか否かの判定なら、これも先のレスに書きましたが、
Global.asax にApplication_AuthorizeRequest ハンドラを実装して
できると思います。ただし、タイムアウトの判定はできないと思います。
> 開発環境で試したところ、イベントが走った後にpageloadでタイム
> アウトかどうか見ていました。具体的にどのようにしたのでしょうか?
-
先に、タイムアウトの判定はできないと思うと書きましたが、認証チケット
を調べれば、タイムアウトの判定は可能でした。HttpApplication.BeginRequest または FormsAuthenticationModule.Authenticate
イベントで認証クッキーを取得し、その Value を復号して認証チケットを
取得できます。ただし、認証チケットが期限切れの場合、FormsAuthenticationModule で認
証クッキーを削除しているようで、HttpApplication.AuthenticateRequest
以降では取得できませんのでご注意ください。- 回答としてマーク 山本春海 2010年4月30日 9:34