31

私の Web アプリは、特定のページを表示するために大量のデータを処理して提供する必要があります。サーバーがまだ処理中である間に、ユーザーがページを閉じたり更新したりすることがあります。これは、サーバーが数分間データを処理し続け、リッスンしていないクライアントにデータを送信することを意味します。

接続が切断されたことを検出して対応することはできますか?

この特定のプロジェクトでは、Django と NginX、または Apache を使用しています。これは、Django 開発サーバーがキャンセルされたリクエストに応答して Broken Pipe 例外を出力するように見えるため、可能であると想定しました。アプリケーションコードがキャッチできる例外を発生させたいと思っています。 JSP でこれができるようですnode.js hereも同様です。

または、問題のページに unload イベント ハンドラーを登録し、このユーザーからの前の要求をキャンセルするように要求する同期 XHR を実行させ、プロセス間通信を実行してそのようにすることもできます。おそらく、より遅いデータ処理が別のプロセスに渡された場合、応答するプロセスを強制終了することなく、より簡単に識別して強制終了できます...

4

2 に答える 2

20

@Oded はリクエスト間で HTTP がステートレスであることは正しいですが、アプリケーション サーバーは実際に、処理中のリクエストに対して基礎となる TCP/IP 接続が切断されたことを検出できます。どうしてこれなの?TCP は信頼できる接続のためのステートフル プロトコルであるためです。

リソースを集中的に使用するリクエストを処理する .Net Web アプリの一般的な手法は、リソースを集中的に使用する作業を開始する前にResponse.IsClientConnected( docs ) を確認することです。もう存在しないクライアントに高価な応答を送信するために CPU サイクルを浪費しても意味がありません。

private void Page_Load(object sender, EventArgs e)
{
    // Check whether the browser remains
    // connected to the server.
    if (Response.IsClientConnected)
    {
        // If still connected, do work
        DoWork();
    }
    else
    {
        // If the browser is not connected
        // stop all response processing.
        Response.End();
    }
}

より関連性の高い例を提供できるように、対象のアプリ サーバー スタックを返信してください。

XHR を使用してクライアント ページのアンロード イベントをサーバーにポストする 2 番目の代替案については、HTTP がリクエスト間でステートレスであるという @Oded のコメントが適切です。これは、特に複数のサーバーを持つファームでは機能しない可能性があります。

于 2014-02-03T14:11:30.387 に答える
-2

HTTP はステートレスであるため、切断されたクライアントを検出する唯一の方法はタイムアウトを使用することです。

このSO の質問に対する回答を参照してください(Java サーブレット: ブラウザーの終了を検出する方法は?)。

于 2010-04-16T10:12:33.643 に答える