0

ユーザーがブラウザを閉じたときに、データベースからレコードを削除したいと考えています。削除したいレコードは、ブラウザを閉じるかログアウトしたユーザーのものです。このコードをグローバルに記述しましたが、機能しません。どんな体でも私を助けることができますか?注:ログアウトしたユーザーのユーザー名を持つレコードを削除したい。グローバルコードに感謝します:

 void Session_End(object sender, EventArgs e) 
    {


        string connStr = ConfigurationManager.ConnectionStrings["dbconn"].ConnectionString;
        SqlConnection sqlconn = new SqlConnection(connStr);
        SqlCommand sqlcmd = new SqlCommand("delete ChatRoomList where UserName=@UserName", sqlconn);
        sqlcmd.Parameters.AddWithValue("@UserName", (string)Session["User"]);
        sqlconn.Open();
        sqlcmd.ExecuteNonQuery();
        sqlconn.Close();

    }
4

2 に答える 2

1

これを達成するための信頼できる方法はありません。Session_Endイベントは、処理中のセッション状態の保存に対してのみ発生し、トリガーポイントは、ブラウザーのクローズまたはユーザーのログアウトとは異なるセッションの有効期限になります。
したがって、あなたの場合、セッションが実際にタイムアウトになったときにイベントを観察できます(ログアウトリンクがある場合は、を使用してセッションの有効期限を強制できますSession.Abandon

サーバーにAJAX呼び出しを行って、ユーザーがログアウトした(またはブラウザーウィンドウを閉じた)ことを通知するなど、他の方法もあります。これらの方法では、より良い結果が得られる場合がありますが、100%信頼できるわけではありません。私が考えることができる最も信頼できる方法は、独自のタイマーを用意することです。つまり、ブラウザー側から定期的にサーバーにpingを実行し(AJAX呼び出しを使用)、特定のタイムアウト値内にpingが受信されない場合は、ユーザーセッションが停止していると想定します。 /終了しました。

于 2013-01-08T10:51:55.090 に答える
0

IEで動作します

   window.onbeforeunload = function (event) {
    if (((window.event.clientX || event.clientX) < 0) || ((window.event.clientY || event.clientY) < 0)) // close button
    {
        //call here you you jQuery function to delete either page method, web service or http 
    }
    if ((window.event.clientX < 0) || (window.event.clientY < 0)) // close button
    {
        //call here you you jQuery function to delete either page method, web service or http 

    }
    else if (window.event.altKey == true || window.event.ctrlKey == true) // ALT + F4
    {
       //call here you you jQuery function to delete either page method, web service or http handler
    }
    else // for all other unload events
    {

    }

}
});
于 2013-01-08T11:07:53.023 に答える