2014-01-11 19 views
5

ASP.NET MVCで簡単なpdfアップローダを実装しました。アップロードしたドキュメントを処理する必要があります。処理にはしばらく時間がかかりますので、バックグラウンドで処理してほしいです。 ワークフローは次のようなものです: 私はユーザに文書をアップロードしてもらい、文書がデータベースに保存されると、新しい文書のアップロードを含め、Webサイト上で他の作業を行うことができるはずです。ユーザーはバックグラウンドでの処理について何も知ってはいけません。バックグラウンドタスクの開始ASP.NET MVC 4.5

私の実装は次のようになります。

[HttpPost] 
public async virtual Task<ActionResult> Confirm(string author, string title) 
{ 
    //... 
    previousDocumentIsProcessing = true; 
    await InvokeDocumentProcessor(_document.Path, _document.DocumentID); 
    previousDocumentIsProcessing = false; 

    return View("Success"); 
} 

問題は処理が行われた後、「成功」ビューが表示されているということです。操作は非同期であるため、ユーザーはクリックして他の作業を行うことができますが、バックグラウンドプロセスを作成して開始し、すぐに「成功」​​ビューを表示することができます。ユーザーは処理に煩わされるべきではありません。

どうすればこの問題を解決できますか? 私はバックグラウンドワーカーを試しましたが、動作しませんでした。(その時点で非同期プロセスを開始できないというエラーが表示されました)

答えて

6

ユーザーは、バックグラウンドでの処理について何も知らないでください。

本当ですか?処理中にエラーが発生した場合はどうなりますか?どのように処理が完了したのかをユーザーはどのように知っていますか?

どうすればこの問題を解決できますか?

私がブログで説明しているように、async does not change the HTTP protocol

適切な解決策は、アップロードされたファイルをどこかに保存するか(Azureブロブストレージなど)、メッセージを信頼性の高いメッセージキュー(Azureキューストレージなど)に挿入し、処理を行う完全に独立したバックエンドを持つことです(例えば、Azureワーカーの役割)。

不適切な(メモリ内の)ソリューションが必要な場合は、another blog post describing that approachです。

+0

私がやっているすべては、PDF(単語単位)の内容を抽出し、中にそれを保存しているので、私は、ユーザーが処理を意識するべきではないかなり確信していますアップロードされたドキュメントを検索可能にするためにWindows Azureのソリューションは本当にうれしいですが、これは簡単な大学プロジェクトであり、Windows Azureを使用することは選択肢ではありません。私は "不適切な"解決策を検討し、あなたに連絡します。回答ありがとうございました:) – mobearette

+0

Azureワーカーロールと同じようにWindowsサービスまたはコンソールアプリケーションを実行できます。 Stephenはパターンの実装について提案しました。 –

+0

修正。 Azureの例は単なる例に過ぎませんでした。ローカルファイルシステム、MSMQ(またはローカルデータベース)、およびWin32サービス(それぞれ)を使用することもできます。 –

関連する問題