У меня было такое же требование для обновления отчетов, и я шел по асинхронному маршруту контроллера, пока не осознал ограничения.Я решил реализовать решение, которое регистрирует обновление отчета из приложения ASP.NET MVC3, и создал службу Windows, которая опрашивает запросы каждые 2 минуты для обработки.
Просмотр
$("#btnRefresh").live("click", function(e) {
$.ajax({
type: "POST",
url: '@Url.Action("Refresh")',
data: "reportId=@Model.Id"
})
.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, чтобы обновить отчет.