Es funktioniert!
Hier ist, was ich getan habe:
Schritt 1 & 2 - Action-Methode aufgerufen wird, langen Faden gestartet wird
Als meine Aktion-Methode aufgerufen wird, es eine eindeutige ID generiert. Ich instanziiere dann eine Instanz meiner PdfGenerator
Klasse, erstelle einen neuen Thread, deraufruft und starte ihn.
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[]
}
}
Sobald der Thread gestartet (oder vor dem Start) der Generator beispielsweise in dem Cache gespeichert ist:
HttpContext.Cache[guid] = generator;
I die den Viewdata guid auch befestigen, so daß sie Bezug meiner Ansicht sein können, Skript.
Schritt 3 & 4 - Anzeige und Update-Status/Fortschritt Ansicht
Nun, da der Thread ausgeführt wird und PDF-Generierung hat, ich begonnen meine Fortschritte View Skript anzuzeigen. Mit jQuery $.getJSON
Ich bin in der Lage eine separate Aktion abfragen, den Status der Generation zu finden:
[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);
}
Meine Ansicht Skript die Json interpretiert und zeigt die entsprechenden Fortschrittsinformationen.
Schritt 5 - Geschenk-Datei Benutzer
Sobald die Generation abgeschlossen ist, wird die Generatoren Zustand entsprechend eingestellt und wenn jQuery diese Information erhält, kann es entweder zur Verfügung stellt einen Link oder die Datei direkt senden mit Javascripts location.href
.
Die Aktion Methode, die die Datei einfach einrichtet und gibt den Generator aus dem Cache wird und gibt das angeschlossene byte []
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");
}
}
ich meine meine eigentliche Arbeit detaillierteren Zustand haben wie Initialised , Ausgeführt und abgeschlossen. Sowie ein Fortschrittsprozentsatz (ausgedrückt als Dezimalzahl, wobei 1,0 vollständig ist).
Also ja, hoffen, dass jemand versucht, hilft etwas Ähnliches zu tun.
Ausgezeichnete Frage ... in derselben Situation stecken! –