非同期 XMLHttpRequest を使用して、ASP.net Web サービスの関数を呼び出します。
XMLHttpRequest で abort メソッドを呼び出すと、サーバーが要求を受信して処理した後、サーバーは要求の処理を続行します。
サーバーでのリクエスト処理を停止する方法はありますか?
2 に答える
一般的に言えば、いいえ、サーバーによって処理されているリクエストが開始されると、それを停止することはできません。結局のところ、サーバーはリクエストが中止されたことをどのように知るのでしょうか?
これは、Web ページに移動したものの、最初のページが読み込まれる前に別のページを閲覧した場合と似ています。その最初の要求は、少なくともある程度は満たされます (もちろん、クライアント側の作業は行われません)。
サーバーで長時間実行されている操作を停止したい場合は、呼び出されているサービスを、中断をサポートできるように設計する必要があります。いくつかの疑似コード:
void MyLongRunningMethod(opId, args)
{
work = GetWork(args)
foreach(workItem in work)
{
DoWork(workItem)
//Has this invocation been aborted?
if(LookUpSet.Contains(opId))
{
LookUpSet.Remove(opId)
return
}
//Or try this:
if(Response.IsClientConnected)
{
HttpContext.Current.Response.End();
return;
}
}
}
void AbortOperation(opId)
{
LookUpSet[opId] = true
}
したがって、ここでの考え方は、MyLongRunningMethod
中止されたかどうかを定期的に確認し、中止された場合は返すというものです。一意であることを意図してopId
いるため、クライアントのセッションIDに現在の時刻などを追加して生成できます(Javascriptではnew Date().getTime()
、エポックからのミリ秒数が取得されます)。
この種のアプローチでは、サーバーは状態を維持する必要があるため (LookUpSet
私の例では)、データベースや単にメモリに保存するなど、何らかの方法でそれを行う必要があります。また、サービスは、abort を呼び出しても機能していない状態にならないように設計する必要があります。これはもちろん、サービスの動作に大きく依存します。
もう 1 つの非常に重要な要件は、データを分割してチャンクで処理できることです。これにより、サービスを中断可能にすることができます。
最後に、何らかの操作を中止する場合は、AbortOperation
呼び出す必要があります。XMLHttpRequest の呼び出しを単に中止しても、操作は完了するまで続行されるため、役に立ちません。
編集
この質問から: ASP.Net: How to stop page execution when browser disconnects?
プロパティをチェックしてResponse.IsClientConnected
、呼び出しが中止されたかどうかを判断することもできます。
一般的に言えば、サーバーは、クライアントにデータを送信しようとするまで、クライアントが切断されたことを認識しません。.NET でクライアントの切断を検出するためのベスト プラクティスを参照してください。サーバーソケットからのクライアントの切断を即座に検出します。
nick_w が書いたように、サーバーが処理しているリクエストを停止することはできません。ただし、サーバー タスクをキャンセルできるようにするソリューションを実装する機能があります。Dino Esposito には、そのような実装方法に関する優れた記事がいくつかあり ます。 ASP.NET AJAX を使用したサーバー タスクのキャンセル
また、次の記事では、サーバーにプールを実装するために Dino Esposito が SignalR ライブラリ の使用方法を説明しています。 ロング ポーリングと SignalR
したがって、サーバー上のタスクをキャンセルする必要がある場合は、これらの記事を出発点として使用して、必要なソリューションを実装できます。