2012-03-14 36 views
2

私は、ユーザーがExcelレポートを作成できるようにするASP.Net MVC Webアプリケーションを用意しています。一部のレポートは作成に約15分かかります。したがって、これらのExcelファイルを非同期で作成し、準備ができたら電子メールで送信したいと考えています。ASP.Net MVCで非同期レポートを作成

Excelファイルを作成する要求でユーザーがフォームを投稿すると、「Excelファイルが添付されたメールが約15分で送信されます」という回答が表示されます。

どうすればよいですか?

答えて

2

これは多少の質問ですが、.NET 4の素敵なスレッディングではTaskを使用できます。

あなたがコントローラでプレーンなアクションを作成することができます。もちろん

[HttpPost] 
public ActionResult ExcelReport(ReportModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     ReportService reportCreator = new ReportService(); // or whatever class you use for that 
     Task.Factory.StartNew(() => reportCreator.GenerateReport(model)); 
     //redirect somewhere or return a plain view with your message 
     return View("ConfirmationMessage"); 
    } 
    return View(); 
} 

あなたはGenerateReportにおける世代の最後にそれを郵送またはより深く行くとGenerateReportメソッドから別のタスクを発射する必要があります。

これはすべてのサーバー側で実行されます。ポップアップを表示するには、たとえば次のようにします。 jQueryを使用してフォームの送信を傍受し、そのモデルをタスクを発生させる任意の関数に渡して、jQueryUIのポップアップをメッセージに使用します。しかしそれは好みの問題です。 :)

+0

ありがとうございます!私はこのソリューションを試して、それはうまく動作します。 – Calluna

1

ASP.NETのバックグラウンド作業の問題は、ASP.NETがAppDomainを破棄していつでも新しいものを作成できることです(リサイクル)。ランタイムが知らないスレッドで作業している場合、それらも破棄されます。

通常の解決方法は、バックグラウンド作業を行う別のWindowsサービスプロセスを用意することです。これは別のプロセスなので、ASP.NETの管理下にありません。

ウェブアプリケーションが完了する前に、ウェブアプリケーションがサービスに何らかの作業を依頼したことを通知します。この通信は通常、サービスでホストされているWCFを使用して行われます。

+0

ありがとう!私は今Task.Factory.StartNew(...)を使用しており、AppDomainが破棄されない限り動作します。私はそれがより多くの時間があるときにWCFサービスを使用して正しい方法を実装しようとします。 – Calluna

関連する問題