0

レポートを作成する Web アプリがあります。mvc3 の Web アプリ。ビルダーは WCF サービスです。
スレッド プールを使用して、レポートを自動的に生成します。
ベース モデルは次のようになります。
-- Web アプリはレポート生成時にリクエストを送信します。
-- WCF サービスはワーカー スレッドを作成し、サービスが作業を受け入れた Web アプリに応答を送信します。
-- Web アプリは引き続き動作します。

必要なもの: WCF ワーカー スレッドがジョブを終了したら、ジョブが完了したことをWeb アプリに通知する必要があります。

それで、私のWebアプリでそのコールバックをキャッチする方法(私はmvc 3を使用しています)

このロジックを実装する最も簡単な方法を提案できますか?

4

5 に答える 5

0

興味深い問題。要件を理解している場合は、レポートがバックグラウンドで生成されている間、ユーザーがビジネスを継続できるようにし、最後にAJAXを介してレポートの準備ができたことをユーザーに通知する必要があります。

あなたは正しい方向に向かっていると思います。私が提案するのは、WCF非同期コールバックを活用することです。MSDNの優れたスターター記事は、こちらから入手できます。コールバックイベントハンドラーは、レポート要求が最初にWCF操作に送信されたときに作成された一意のキャッシュキーを使用して、レポートのキャッシュステータスを設定する必要があります。

クライアント側の通知は、AJAXによって有効にされた同じ一意のキャッシュキーを使用してレポートのステータスを定期的にチェックするレポートステータスポーリングメカニズムを使用して実現できます。

非同期WCFコールバックの簡単な例では、次のようなことができます。

ReportServiceClient reportSvcClient = new ReportServiceClient();
Guid reportStatusKey = Guid.NewGuid();
reportSvcClient.GenerateReportCompleted += new EventHandler<GenerateReportCompletedEventArgs>(ReportStatusCallback);
reportSvcClient.GenerateReportAsync(reportStatusKey, <other operation paramters>);

// Set initial report status to False
// (recommend setting an appropriate expiration period)
Cache.Insert(reportStatusKey.ToString(), false);

// WCF callback static method which sets the report status in cache 
static void ReportStatusCallback(object sender, GenerateReportCompletedEventArgs e)
{
    Cache[e.ReportStatusKey.ToString()] = e.IsComplete;
}
...
public partial class GenerateReportCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
{
    private object[] results;

    public GenerateReportCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
        base(exception, cancelled, userState)
    {       this.results = results;         }

    public Guid ReportStatusKey
    {
        get            {
            base.RaiseExceptionIfNecessary();
            return ((Guid)(this.results[0]));
        }
    }
    public bool IsComplete
    {
        get {
            base.RaiseExceptionIfNecessary();
            return ((bool)(this.results[1]));
        }
    }
}

クライアント側のAJAX実装は、同じReportStatusKeyを使用して、適切と思われる頻度でレポートのキャッシュステータスを確認できます。

于 2012-09-29T05:08:38.160 に答える
0

WCF にはCompletion Callbacksと呼ばれるものが含まれています。ここで、クライアントには、非同期操作が完了したときにのみ、WCF に呼び出すように要求するメソッドがあります。

例えば:

public class MyClient : IDisposable
{
    BuilderClient _proxy = new BuilderClient();

    public void CallAsync(object input)
    {
        _proxy.BeginBuildReport(input, Oncompletion, null);
    }

    void OnCompletion(IAsyncResult result)
    {
        object output = _proxy.EndBuildReport(result);
        //Do whatever you want with your output here.
    }

    public void Dispose()
    {
        _proxy.Close();
    }
}

これにより、単純なイベント ドリブン モデルを使用できるようになります。

于 2012-10-04T09:11:27.850 に答える
0

これはあなたを助けることができます: バックグラウンド スレッドからのコールバックを含む WCF サービス?

十分でない場合は、webapp にプッシュ通知を実装する必要があります。

于 2012-10-03T23:57:08.817 に答える
0

Comet または Reverse-Ajax を使用する方法があります。これは以前ここで回答されています: Is there some way to PUSH data from web server to browser?

于 2012-09-27T02:07:48.387 に答える
0

svcutil /async を使用して、wcf サービスの非同期プロキシを生成してみませんか。そうすれば、サービス内に独自のワーカー スレッドは必要なく、クライアントは単にコールバックに登録するだけです。

于 2012-10-02T15:02:44.977 に答える