0

私はあなたが私の別の質問のいくつかで読むかもしれない長期実行オペレーションを持っています(あなたの参照のためにここに最初2番目があります)。

取引全体の最初に、プロジェクトは、ユーザーが XML ファイルに関するすべての必要な情報を指定し、XML ファイル自体をアップロードする必要があるフォームを公開します。その方法では、すべてのユーザー入力データがキャッチされ、そのようなファイルのキングを処理する WCF サービスに送られました。コントローラは、そのような処理のタスク ID のみを取得しました。その後、ユーザーは進行状況バーのページにリダイレクトされ、タスクの完了状況を定期的に取得し、進行状況バーを更新します。

だからここに私の問題があります。XML ファイルの処理が終了した場合、結果を取得してユーザーに表示するにはどうすればよいですか?

HTTP がステートレス プロトコルであることは知っていますが、この状況で役立つ Cookie メカニズムがあります。もちろん、処理結果を一時的な場所 (WCF サーバーの静的クラスなど) に保存することもできますが、サービスの負荷が高いため、提供されたメモリがすべて消費されます。

つまり、タスクを (netNamedPipeBinding を使用して) WCF サービスに渡し、できるだけ早く結果を受け取りたいと考えています。一時的な保存結果をいくつかのバッファーにエスケープし、クライアントがそれを収集するまで待ちます。


私が行っている限り、サービス側ではなくクライアント側で一時バッファを使用しています:

using (XmlProcessingServiceClient client = new XmlProcessingServiceClient())
{
    client.AnalyzeXmlAsync(new Task { fileName = filePath, id = tid });
    client.AnalyzeXmlCompleted += (sender, e) =>
    {
        System.Web.HttpContext.Current.Application.Lock();
        // here is I just use single place for all clients. I know it is not right, it is just for illustrating purposes.
        System.Web.HttpContext.Current.Application["Result"] = e;
        System.Web.HttpContext.Current.Application.UnLock();
    };
}
4

4 に答える 4

3

問題に対処するには、 SignalR ハブを使用することをお勧めします。クライアントでメソッドを直接呼び出して、操作の完了を通知する方法があります。そして、これは、そのような戦略を実装する際に発生する実際のインフラストラクチャの問題に対処する必要なく発生します。さらに、 SignalRは、asp.net MVC アプリケーションに簡単にプラグインできます。

于 2012-11-08T06:15:50.910 に答える
0

これが最善の解決策かどうかはわかりませんが、同様のことができました。これは一般的なセットアップでした:

  1. コントローラー A は、実行するアクションのパラメーターを使用して新しいクラスを初期化し、ユーザーのセッション オブジェクトを渡しました。
  2. 新しいクラスがバックグラウンド スレッドでメソッドを呼び出し、そのメソッドがユーザーのセッションの進行に合わせて更新されました
  3. コントローラー B には、クライアント側の JavaScript によって呼び出されたときにユーザーのセッション データをチェックし、最新の進行状況を返す json メソッドがありました。

このスレッドは、そのような方法でセッション オブジェクトを使用することは悪いことだと述べていますが、SQL や一時ファイルなどのスレッド セーフなストレージ メソッドで同様のことができると確信しています。

于 2012-11-08T00:03:06.917 に答える
0

これが念頭にある場合、netNamedPipeBindingはクロスマシン通信では機能しません。

IIS でサービスをホストする場合は、HTTP をトランスポート プロトコルとして使用するバインディングの 1 つが必要になります。両方のエンドポイントがメッセージを送信できるようにする二重サービスを見てください。このようにして、サーバーはいつでもクライアントにメッセージを送信できます。進行状況レポート用のコールバック インターフェイスを作成できます。タスクが完了するまでにかなりの時間がかかる場合、HTTP を介した進行状況レポートのオーバーヘッドは問題ない可能性があります。

また、Silverlight ( PollingDuplexHttpBinding )で HTTP 経由の二重通信を使用する場合は、二重サービスの構築とアクセスも参照してください。

最後に、ASP.NETのComet実装を探すことができます。CodeProject では、少なくとも 2 つ ( CometAsyncPokeIn ) を実行します。

于 2012-11-07T22:50:14.033 に答える
0

正直なところ、wcf サーバーなどについてはよくわかりませんでしたが、もっと抽象的な答えを提供できると思います。念のため:

  1. いくつかのフィールドとファイルのアップロードを含むフォームがあります
  2. ユーザーがフォームに入力し、XML ファイルを提供します。
  3. XML ファイルを処理する WFC サービスに送信します。
  4. その間、更新される進行状況バーを表示します
  5. 完了後、結果を表示します

これが望ましくない場合、またはこれがあなたの質問の内容ではない場合は、私の回答をスキップできます。それ以外の場合は読み進めてください。

始める前に: ステップ 3 は少しあいまいです: データをサービスに送信して結果が返されるのを待つか、データをサービスに送信してサービスが返されるのを待たないことを意味する場合があります。結果。

状況 1:

  1. すべての必須フィールドを含むフォームをビューで作成します
  2. ポストバックを処理するコントローラーでアクションを作成します。
  3. アクションはデータをサービスに送信し、サービスが結果を返すと、アクションは結果を含むビューをレンダリングします。
  4. 送信ボタンで、クリックイベントにJavaScriptを追加します。これにより、進行状況を返すサーバー側コードへの ajax 呼び出しがトリガーされます。
  5. JavaScriptは、正しい進行状況を示すある種のステータスバーを表示し、x秒ごとに繰り返します
  6. コントローラーが終了すると、結果が表示されます

状況 2:

  1. -
  2. -
  3. データをサービスに送信した後、コントローラーは進行状況バーを含むビューを表示します。
  4. xml ファイルのステータスをチェックし、プログレスバーを更新するドキュメントの準備完了時に JavaScript イベントを追加します。(状況 1 のステップ 4 の onclick イベントと同じ)
  5. プログレスバーが 100% に達すると、結果を表示する別のページにリダイレクトされます

これはあなたの質問に答えていますか?

よろしくお願いします、

BHD

于 2012-11-03T08:45:34.363 に答える