Lang andauernder Prozess, der eine Datei zurückgibt

8

Ich verwende ASP.NET MVC und habe einen langen Prozess. Insbesondere erzeuge ich eine große PDF-Datei, die der Benutzer herunterladen kann.

Ich verstehe das Grundkonzept:

  1. Die Aktionsmethode wird
  2. aufgerufen
  3. Neuer Thread hat begonnen, den Prozess
  4. zu generieren
  5. Gibt eine Ansicht zurück, die dem Benutzer mitteilt, dass (pdf) generiert wird
  6. Verwenden Sie AJAX, um den Server anzurufen und nach dem Fortschritt zu fragen
  7. Wenn Sie fertig sind, legen Sie die Datei dem Benutzer zum Herunterladen vor.

Die Teile, die ich nicht vollständig verstehe, sind:

  • Die Verwaltung des Threads über separate AJAX-Aufrufe. Ich werde möglicherweise eine Möglichkeit brauchen, den laufenden Thread zu finden und einen Status anzufordern. Gibt es einen statischen Kontext, in dem ich einen Verweis auf den Thread beibehalten kann? Ich bin mir der Datenspeicherung in HttpContext.Application bewusst, wäre das dafür geeignet?
  • Und wie man die fertige Datei präsentiert. Erstelle ich eine temporäre Datei und präsentiere einen Download-Link? Oder kann ich einen abschließenden AJAX-Aufruf machen, der die Datei zurückgibt?
jeef3 24.08.2009, 22:09
quelle

2 Antworten

6

Das Cashe ist dafür sehr gut geeignet. Es ist nur eine Sache, sicherzustellen, dass das zwischengespeicherte Objekt niemals entfernt wird, während der Prozess läuft (Sie können dafür ItemPriority.NotRemovable verwenden).

Sie können die Datei auf dem Datenträger im temporären Ordner speichern oder sie für einige Zeit im Cache behalten (abhängig davon).
Ich persönlich mag es nicht, Festplatten mit Dateien zu verschmutzen, so dass ich die Datei im Cache behalten würde (mit MediumPriority während einiger Minuten). Aber die Datei ist groß und kann oft mit der Datenbank des Dateisystems erstellt werden.

Auf dem Client, wenn die letzte Ajax-Anfrage das Ergebnis zurückgibt (kann aussehen wie {progress: "100%", resultUrl: " Ссылка "} ) Sie können den Browser auf eine URL umleiten Es wiederum wird diese Datei als binäres Ergebnis rendern.

Client Umleitung kann mit Javascript wie folgt durchgeführt werden:

%Vor%

BTW, wie generieren Sie PDF? NFOP?

    
Dmytrii Nagirniak 24.08.2009, 23:31
quelle
7

Es funktioniert!

Folgendes habe ich getan:

Schritt 1 & amp; 2 - Aktionsmethode wird aufgerufen, langer Thread wird gestartet

Wenn meine Aktionsmethode aufgerufen wird, wird eine eindeutige ID generiert. Ich instanziiere dann eine Instanz meiner Klasse PdfGenerator , erstelle einen neuen Thread, der PdfGenerator.Generate aufruft und starte ihn.

%Vor%

Sobald der Thread gestartet wurde (oder vor dem Start), wird die Generatorinstanz im Cache gespeichert:

%Vor%

Ich füge auch die GUID an die ViewData an, so dass sie eine Referenz in meinem View-Skript sein kann.

Schritt 3 & amp; 4 - Anzeige und Aktualisierung der Status- / Fortschrittsanzeige

Jetzt, da der Thread ausgeführt wird und die PDF-Generierung begonnen hat, kann ich mein Fortschrittsansichtsskript anzeigen. Mit jQuerys $.getJSON kann ich eine separate Aktion abfragen, um den Status der Generierung zu finden:

%Vor%

Mein Ansichtsskript interpretiert den JSON und zeigt die entsprechenden Fortschrittsinformationen an.

Schritt 5 - Datei dem Benutzer präsentieren

Sobald die Generierung abgeschlossen ist, wird der Status des Generators entsprechend festgelegt. Wenn jQuery diese Informationen erhält, kann er entweder einen Link zur Verfügung stellen oder die Datei direkt mit Javascripts location.href senden.

Die Aktionsmethode, mit der die Datei eingerichtet und zurückgegeben wird, ruft den Generator einfach aus dem Cache ab und gibt das angehängte Byte []

zurück %Vor%

Meine aktuelle Arbeit Ich habe einen detaillierteren Status wie Initialisiert, Laufen und Abgeschlossen. Zusätzlich zu einem Fortschrittsprozentsatz (ausgedrückt als Dezimalzahl, wobei 1,0 vollständig ist).

Also ja, hoffe, das hilft jedem, der etwas Ähnliches versucht.

    
jeef3 25.08.2009 04:24
quelle

Tags und Links