- PR -

ASP.NETにおけるTimerイベントについて

投稿者投稿内容
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2004-09-08 19:06
いつも勉強させていただいております。

今回、定期的にセッションクッキーの値を確認するASP.NET
のページを作成することになり、下記のようなソースを
実行しました。


public void CreateTimer()
{
 System.Timers.Timer aTimer = new System.Timers.Timer();
 aTimer.Elapsed+=new ElapsedEventHandler(SessionCookie_Check);
 aTimer.Interval=5000;
 aTimer.Enabled=true;
}

public void SessionCookie_Check(object source, ElapsedEventArgs e)
{
try
 {
  Cookie_Check();
 }
catch(Exception ex)
 {
  string ErrorMsg= "Error :" + ex.Message + "Source:" + ex.Source;
 }
}

public void Cookie_Check()
{
 HttpCookie ID_Cookie;
 HttpCookieCollection Cookie_Col;
 Cookie_Col=Request.Cookies;
 ID_Cookie=Cookie_Col["ID"];
}

Page_LoadでCreateTimerを呼び出し、タイマー自体は
この設定ですと5秒に一回SessionCookie_Checkを呼び
出すのですが、SessionCookie_Checkによって呼び出さ
れるCookie_CheckにおけるRequest.Cookiesでエラーに
なってしまいます。

エラー内容は
「このコンテキストでは要求が有効ではありません。」
となっております。

System.Timers.Timerのオブジェクト内では
System.Web.UI.Pageオブジェクトの関数は使用できない
のでしょうか?

この方法以外でも結構ですので、timer関数を使用した
定期的なcookieのチェック方法をご存知の方いらっしゃい
ましたら、よろしくご教授お願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-09-08 19:33
サーバーサイドでTimerを使用しても意味がないのではないのでしょうか?
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2004-09-09 08:27
burton999様 ご返答ありがとうございました。

引用:

burton999さんの書き込み (2004-09-08 19:33) より:
サーバーサイドでTimerを使用しても意味がないのではないのでしょうか?



全くその通りです。何を考えていたのか、お恥ずかしい限りです。
結局これを実現する為には、クライアントサイドでJavaScript等を
動かしてチェックするしかないのでしょうか?

何とかASP.NETでクライアントサイドのクッキー定期的にチェック
する方法はないものでしょうか?




Ten.
ベテラン
会議室デビュー日: 2003/04/03
投稿数: 67
投稿日時: 2004-09-09 11:07
Cookieに保存されているセッションIDを確認したいということでしょうか?

それでしたら、ページにLabelコントロールを置いてPage_Loadで
コード:
Me.Label1.Text = Session.SessionID


とします。(試したのがVB.NETでしたのでC#に読み替えてください)

後は、リロードさせるクライアントスクリプトを用意するだけです。
面倒だったので、以下のようにHTMLソースに直接書いて試しましたが、他にも方法はあると思います。(リロードさせる間隔をセッションタイムアウトより長くしないと、同じ値を表示し続けるだけで意味がありません)
コード:
<body onload="setTimeout('location.reload();',1000,'javascript');">



ただ気になるのは、これに何の意味があるのか?ということです。

何か目的と手段が噛み合っていないような気がするのですが、何を行いたいのでしょうか?
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2004-09-09 11:33
Ten.さん書き込みありがとうございます。
引用:

Ten.さんの書き込み (2004-09-09 11:07) より:
ただ気になるのは、これに何の意味があるのか?ということです。

何か目的と手段が噛み合っていないような気がするのですが、何を行いたいのでしょうか?



目的は二重ログインの防止処理を作成することです。
Aがログインすると、DBにAがアクセスした時間をもとに
作成したHASH値を書き込み、その値をセッションクッキーで
保持します。
同じIDを持ったBがログインするとDB上のHASH値が変わります。

そうするとAが保持しているHASH値とDB上のHASH値が異なる為
Aに対し何らかのエラー処理を行います。

この為に、Aのセッションクッキーを定期的に取得し、その値
をDB上の値と比較する処理を行いたいのです。

自分もJavaScriptのreloadで行っていますが、できればブラウザ
のreloadが行われない方法が無いでしょうか?

よろしくご教授お願いします。
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2004-09-09 12:28
代案ですが…

ログイン時の情報(UserID、ログイン時刻)をDBに格納して、ログイン時にそのユーザが既にログインしているかどうかをチェックするような仕組みにしてはいかかでしょうか?
(異常終了でDBにUserIDが残る可能性もありますが、その場合は、ログイン時刻で判断します。)

[ メッセージ編集済み 編集者: ZEBRA 編集日時 2004-09-09 12:34 ]
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2004-09-09 13:16
ZEBRA様ご返答ありがとうございます。

引用:

ログイン時の情報(UserID、ログイン時刻)をDBに格納して、ログイン時にそのユーザが既にログインしているかどうかをチェックするような仕組みにしてはいかかでしょうか?
(異常終了でDBにUserIDが残る可能性もありますが、その場合は、ログイン時刻で判断します。)



この辺は要件定義で詰めたところですが、まさに異常終了時の処理で
問題になりまして、結局正規のユーザーの再ログインか悪意のユーザ
の二重ログインかの判断がログイン時刻ではできないという結論に
なりましてこの方法になりました。
momotchi
常連さん
会議室デビュー日: 2004/01/16
投稿数: 28
お住まい・勤務地: 宮城県
投稿日時: 2004-09-09 13:52
ApplicationオブジェクトにIDを埋め込むのは
いかがでしょう。

Session開始時
Session["ID"] = "123";
Application[Session["ID"].ToString()] = Session["ID"];

Session終了時
Application.Remove(Session["ID"].ToString());

2重ログインの監視は。ログイン時に
Application[Session["ID"].ToString()]
があるかどうかをチェックする。

#話の内容を理解しきれてるかな・・・私。

スキルアップ/キャリアアップ(JOB@IT)