Это работает!
Вот что я сделал:
Шаг 1 & 2 - Действие Метод вызывается, долго выполняющиеся поток запускается
Когда мой метод действия вызывается, он генерирует уникальный идентификатор. Затем я создаю экземпляр класса PdfGenerator
, создаю новый поток, который вызывает PdfGenerator.Generate
и запускает его.
public class PdfGenerator
{
public string State;
public byte[] Data;
public void Generate()
{
// Generate PDF/Long running process
// Should update State as it goes
// ...
// Once finished, Data is populated with the binary byte[]
}
}
После того, как поток начал (или перед запуском) экземпляр генератора хранится в кэше:
HttpContext.Cache[guid] = generator;
Я также прикрепить Guid к ViewData, так что это может быть ссылка на мой взгляд, скрипт.
Шаг 3 & 4 - Отображение и изменение статус/прогресс вид
Теперь, когда поток запущен и генерация PDF начала, я могу показать мой взгляд прогресса сценарий. Использование JQuery-х $.getJSON
я могу опрашивать отдельные меры, чтобы найти статус генерации:
[OutputCache(Duration = 0, VaryByName = "none", NoStore = true)]
public JsonResult CheckPdfGenerationStatus(string guid)
{
// Get the generator from cache
var generator = HttpContext.Cache[guid] as PdfGenerator;
if (generator == null)
return Json(null);
else
return Json(generator.State);
}
Мой взгляд сценарий интерпретирует JSon и отображает соответствующую информацию о ходе.
Шаг 5 - Present файл пользователю
После того, как генерация будет завершена, состояние генераторов устанавливается соответствующим образом и когда JQuery получает эту информацию, она может либо предоставлять ссылку, или непосредственно отправить файл с помощью javascripts location.href
.
Способ действий, который устанавливает и возвращает файл просто получает генератор из кэша и возвращает вложенные байты []
public ContentResult DownloadPdf(string guid)
{
var generator = HttpContext.Cache[guid] as PdfGenerator;
if (generator == null)
return Content("Error");
if (generator.State == "Completed")
{
return Content(generator.Data);
}
else
{
return Content("Not finished yet");
}
}
Моей моя фактическую работу я получил более детальное состояние, такие как инициализируются , Запуск и завершение. Также как процент прогресса (выраженный как десятичный, 1.0 полный).
Так что да, надеюсь, что кто-нибудь еще поможет сделать что-то подобное.
Отличный вопрос ... застрял в такой же ситуации! –