4

現在、次の目的で async/await 機能を利用することを検討しています。

  1. ファイルを提出します。
  2. たとえば、このファイルには 1 つ以上のエントリを含めることができます。(例: の要素が 1 つだけの XML ファイルの場合もあれば、ファイルごとに複数のノードがリストされている場合もあります)
  3. 各呼び出しを個別に処理し、完了したアイテムのリストに追加し、個々のタスクの完了として進行状況を返す必要があります。(完了: 0/2 ----> 完了 1/2...)
  4. これをビューに送り返す必要があります。これにより、この機能を使用している人は誰でも、個々の通話がインポートされたことを確認できます。

これを実現するために、Json を使用してページ/プログレスバーを非同期的に更新します。

私が予見している問題はこれです:

サブミットを呼び出してコントローラーに移動する場合、個々の呼び出しごとに応答が必要になります。ファイルを送信し、(各 Call ノードを決定するための) いくつかの処理を完了するまで、ファイルに含まれる Call の数はわかりません。リストに追加した完了した項目ごとに応答を得るための明確な方法はありますか?

4

2 に答える 2

9

残念ながら、asyncこれawaitはできません。私のブログで説明しているように、asyncは HTTP プロトコルを変更しません。要求ごとに 1 つの応答を取得します。それだけです。

そのため、ファイルが送信されたら、そのファイルの何らかの識別子を作成し、処理のために永続的なバックグラウンド キューに送信します。ポーリング / ロング ポーリング / websockets / SignalR を使用して、クライアントに進行状況を通知できます。

ASP.NET は、未処理の要求がなければプロセスをリサイクルできると想定しているため、MVC コントローラー以外で処理を行う必要があることに注意してください。Win32 サービスまたは Azure ワーカー ロールのように。

また、これが Web ファーム内のサイトの場合、すべての Web サーバーから永続キューに到達できる必要があります。また、Azure Web ロールでホストしている場合、Azure はコンピューター全体をリサイクルするため、ディスク (または MSMQ) 上に置くことはできません。その場合は、Azure ストレージまたはサービス バスにある必要があります。

于 2012-10-04T22:23:08.700 に答える
2

正確な要件はわかりませんが、TelerikMVCアップロード拡張機能やその無料などの請求に適合する既製のアップロードコントロールを使用できます。

http://demos.telerik.com/aspnet-mvc/upload

または、独自のカスタムロールを行うこともできます。私が考えているのは、ユーザーがxmlファイルをアップロードすると、コントローラーメソッドがそれらを処理のためにバックグラウンドキューに入れるか、処理を処理してチケット番号を返すWindowsサービスに渡すことができるということです。クライアント。チケット番号を介してクエリされたファイルのアップロードの進行状況/ステータスを提供する別のWebサービス/RESTfulサービスを公開し、クライアント/ Webサイトに定期的にWebサービスにクエリを実行させて、進行状況を取得し、ユーザーに進行状況を表示します。

MVCの既存のアップロード拡張機能を使用する方が簡単だと思うので、車輪の再発明をする必要はありません。私の考えはとにかく:-)

于 2012-10-04T22:46:39.823 に答える