質問

ASP.NET Webサービスを使用しています。これは、ファイル操作や、多数のクリスタルレポートからExcelシートを生成するなど、面倒な作業を行います。このWebサービスを呼び出すことでブロックされたくないので、Webサービスの呼び出しを非同期にしたいです。また、このWebサービスをWebページから呼び出し、サーバーをポーリングし続けることができるメカニズムが必要です。これにより、たとえば、ファイルの数など、進行状況のインジケーターを画面に表示できます処理されました。 Webメソッド呼び出しの完了時に通知が必要ではなく、実際の進行状況が必要なことに注意してください。どうすればいいですか?

役に立ちましたか?

解決

スケジュールされたジョブのIDを渡すことで照会できる別のメソッドをサーバー上に記述します。このメソッドは、0〜100(または0.0〜1.0、または何でも)の間のおよその値を返します。 。

E.g。 RESTスタイルでは、 http://yourserver.com/app/jobstatus/4133/ に対してGETリクエストを行うと、 text / plain 。次に、その間隔(秒?2秒?10秒?)をクエリして、その距離を確認する必要があります。

バックエンドで実際に監視を達成する方法は、プロセスが何であり、どのように機能するかに大きく依存します。

他のヒント

XML Webサービスは遅いと思うので、複数のメソッドを作成してポーリングすると、進行が非常に遅くなり、サーバーに大きな負荷が発生します。実稼働環境では実行しません。データベースポーリングでも同じ(ただし小さい)問題が発生します。

代わりに SOAP拡張機能を試してください。イベント駆動型モデルを実装します。 MSDNのWebサービスクライアントアプリケーションへのプログレスバーの追加を参照してください。

SoapExtensionsを使用して、クライアントにダウンロード/プロセスの進行。その後、サーバーはクライアントにイベントを送信できます。使用しない場合は、クライアントで何も変更する必要はありません。

クライアントで次のようなことを許可します:

//...
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService ();
_myWebService.processDelegate += ProgressUpdate;
_myWebService.CallHeavyMethod();
//...

private void ProgressUpdate(object sender, ProgressEventArgs e)
{
  double progress = ((double)e.ProcessedSize / (double)e.TotalSize) * 100.00;
  //Show Progress...
}

最初の「レポート生成の開始」を行いますWebサービス呼び出しは、タスクプールにタスクを作成し、呼び出し元にタスクのIDを返します。

次に、「完了率」を返す別のメソッドを提供します。特定のtaskIdに対して。

完了したタスクの実際の結果を返す3番目のメソッドを提供します。

最も簡単な方法は、Webサービスがデータベースのフィールドを呼び出しの進行に合わせて更新し、そのフィールドを照会して値を返すWebサービスを作成することです。

Webサービスを作成して、何らかのタスクIDまたはセッションIDを返します。そのIDでクエリする別のWebメソッドを作成し、必要な情報(%完了、ファイルのリストなど)を返します。クライアントから一定の間隔でこのメソッドをポーリングします。

データベースを使用してプロセス情報を保存します。Webサービスのメモリでこれを行うと、Webファーム環境ではうまく機能しません。タスクが別のサーバーで実行される可能性があるためです。ポーリング。

編集:別の同様の答えを見て、それにコメントしました。コメントは正しいです-ディスク操作を回避するためにメモリ内テーブルを使用できますが、それでも別のdbサーバーを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top