レポートを更新するのと同様の要件がありましたが、制限が実現するまで非同期コントローラのルートがダウンしました。私は、ASP.NET MVC3アプリケーションからレポートの最新表示を登録し、処理のために2分ごとに要求をポーリングするWindowsサービスを作成するソリューションを実装することに決めました。
ビュー
$("#btnRefresh").live("click", function(e) {
$.ajax({
type: "POST",
url: '@Url.Action("Refresh")',
data: "[email protected]"
})
.done(function(message) {
alert(message);
})
.fail(function(serverResponse) {
alert("Error occurred while processing request: " + serverResponse.responseText);
});
e.preventDefault();
});
コントローラーアクション
[HttpPost, VerifyReportAccess]
public ActionResult Refresh(Guid reportId)
{
string message;
try
{
message = _publisher.RequestRefresh(reportId);
}
catch(Exception ex)
{
HttpContext.Response.StatusCode = (Int32)HttpStatusCode.BadRequest;
message = ex.Message;
}
return Json(message);
}
リポジトリ
public string RequestRefresh(Guid reportId)
{
var scheduledReport = _repository.GetScheduleForReport(reportId);
if (scheduledReport.CompanyId == Guid.Empty)
throw new Exception("Requested Report Not Found");
if(_repository.CheckPendingRefresh(scheduledReport))
return "A request to refresh this report is already pending.";
_repository.ScheduleReportRefresh(scheduledReport);
return "A request to refresh the report has been submitted. The report will appear online when available.";
}
Windowsサービスは、レポートをリフレッシュするために毎晩ETLプロセスと同じクラスライブラリのコードを実行します。
ASP.NET MVC3には、バックグラウンドプロセスをスピンアップして実行を継続できるという点で非同期サポートはありません。 aspnetワーカープロセスは、すべての非同期プロセスが完了するまでブロックされます。ただし、要求を登録してWindowsサービスで処理し、データベースに状態を記録させることができます。 MVCアプリケーションは要求IDに基づいてステータスをポーリングできます。 – tawman