2016-10-07 11 views
3

基本的に、ユーザーがタブを閉じるときに、信頼できるログアウト機能を探しています。これにはいくつかのサーバーコードを呼び出すことが含まれているので、クッキーの削除などのクライアント側のみのすべてのメカニズムが私にとってうまくいかない。ASP.NET MVC:LogOutハートビート機能

インターネットでは、ほとんどの場合、window.unload機能を傍受してそこにコードを配置する方法があります。 window.unloadをトリガーする可能性がある他のイベントからの通常のナビゲーション要求をフィルタリングする可能性があることは知っていますが、信頼できるように同期AJAXコールを作成する必要があるため、私が望むものを達成するための最良の方法ではありません。

ハートビートを実装して、クライアントが応答するかどうか定期的に確認する2つ目の方法があります。私はこれが私のシナリオに最適なアプローチだとは思いますが、実際にはASP.NET MVCの実装に苦しんでいます。

どのように私はASP.NET MVCでこれにアプローチしますか?私はすでにSignalRを考えましたが、実際にはSignalRコンテキスト内のセッション情報に直接アクセスすることはできません。

答えて

1

これのいくつかの実装を見つけるのは簡単です(たとえば、this questionを参照)。 HTML(ビートを送信してウェブサイトのページ)、コントローラ(ビートを受信)し、(あなたのハートビート機能付き)JavaScriptのファイル:あなたは3つのファイルが必要になります基本的なハートビートの実装については

。 HTMLファイルにJavaScriptコードを含めることもできますが、分離したままにする方が良い方法です。

HTMLファイル(Heart.cshtml)

注意あなたがJavaScriptファイルおよびjQueryの両方を含める必要があります。

ここでは、私の作業例の正確な内容を持っています。 @ Url.Action( "ReceiveHeartbeat"、 "Auxiliary")は、コントローラ(AuxiliaryController)のメソッド(ReceiveHeartbeat)にアドレスを与えます。

<head> 
    <script type="text/javascript" src="~/Scripts/heartBeat.js"></script> 
    <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script> 
</head> 

<body>   
    <script type="text/javascript"> 
     LaunchHeartBeat('@Url.Action("ReceiveHeartbeat", "Auxiliary")'); 
    </script> 
</body> 

のJavascript(heartBeat.js)

他の人々はのsetTimeoutを使用していますが、のsetTimeoutを使用してループをしたい場合はクリーナーです。 setInterval(myFunction、myInterval);を使用して2つの関数を書くことをお勧めします。(下記参照)。 Ajaxリクエストにさらに多くのものを追加することができます(たとえば、の成功:アクション)。

function LaunchHeartBeat(actionUrl) { 
    var intervalMilliseconds = 750; 
    setInterval(function() { 
     $.ajax({ 
      type: "POST", 
      url: actionUrl 
     }); 
    }, intervalMilliseconds); 
} 

コントローラ(AuxiliaryController。CS)

[HttpPost] 
public JsonResult KeepSessionAlive() 
{ 
    // You may do stuff here 
    return new JsonResult { Data = "success" }; 
} 

編集:Javascriptのファイル用の代替構文:

var actionUrl = null; 
var intervalMilliseconds = 1000; 

function LaunchHeartBeat(myUrl) { 
    actionUrl = myUrl; 
    setInterval(HeartBeat, intervalMilliseconds); 
} 

function HeartBeat() { 
    $.ajax({ 
     type: "POST", 
     url: actionUrl 
    }); 
} 
関連する問題