0

ASP.NET サイトに Web メソッドがあり、実行時間が長く、多くの CPU 容量を消費する可能性があります。また、リクエストが返される前に、ユーザーがサイトから他のパラメータまたは複数のパラメータを使用して新しいリクエストを開始する可能性もあります。クライアント側で中止を行います:

if (xhrConfigurate != null) {
   xhrConfigurate.abort();
}

もちろん、abort はサーバー上の計算を停止しません。これは問題ありません。サーバーは必要なことを行いますが、古い要求の結果は返しません。しかし、場合によっては、サーバーがすべてのリクエストをタイムリーに処理するのに問題があるようです。そのため、ユーザーが新しいリクエストを開始したときに、古いリクエストも強制終了したいと考えています。scriptmanager を使用していくつかの解決策を見つけましたが、その使用は避けたいと思います。

webmethod 自体は非同期スレッドであるため、このスレッドのインスタンスを取得して辞書に保存し、完了していないユーザーの古い要求を中止し、要求が完了したら削除することはできませんか?

<WebMethod> Public Shared Function myRequest(ByVal params As String) As String
   'Get the dictionary with requests
   'Test the dictionary on old unfinsihed request for the user, if there is one: abort
   'Add this request to the dictionary

   'Do work...

   'If work finsihed: remove this request from dictionary
   Return result
End Sub
4

2 に答える 2

0

一般に、長時間実行されるプロセスを ASP.NET 内で実行することはお勧めできません。代わりに、別のサーバー プロセスを作成し、ASP.NET コードをそのプロセスへの要求をキューに入れる必要があります。

サーバーは一意の値を ASP.NET に返し、ASP.NET はその値を Web ページに送り返すことができます。ユーザーが要求を行うと、その値を ASP.NET に渡し、ASP.NET がその値をサービスに渡します。サービスは、その一意の値で実行されている要求が既に存在するかどうかを判断できます。存在する場合、サービスはそのスレッドを中止できます。

于 2013-09-03T09:58:24.790 に答える
0

私の理解が正しければ、リクエスト キューを含むグローバル変数ディクショナリを用意して、Web メソッドの実行で同じディクショナリを共有する必要がありますか?

グローバル変数を使用するのは難しいことです。IIS アプリケーション プールはいつでも再起動する可能性があります。どこかで読んだところによると、IIS では 24 時間または 29 時間ごとに自動的にリサイクルされます。そのため、グローバル変数の値が失われる可能性があります。

問題に関連するスレッド: Appdomain のリサイクルとは正確には何ですか

ASP WebApi サービスがあり、同様の長時間実行タスクがあります。ASP アプリケーションをコンソール アプリ (ホスト) (IIS なし) でホストし、ObservableCollection 変数を使用して要求を AppDomain に格納します。

次に、各リクエストスレッドはそのコレクションに安全にアクセスできます(私が間違っていなければ)。

于 2013-09-03T08:46:11.850 に答える