2016-06-07 6 views
0

Wir haben einen langen laufenden Bericht, der jetzt mit Reporting Services geplant wird. Dieser Bericht dauert etwa 40 Minuten und erzeugt einen CSV-Bericht von etwa 10 MB Daten. Wir bauen jetzt eine neue Asp.Net MVC-App auf und der Benutzer möchte, dass wir diesen lang laufenden Bericht in ASP.Net MVC bringen und die Reporting-Services beenden. Anfangs dachten wir daran, dies mit Task.Run/HostingEnvironment.QueueBackgroundWorkItem zu tun, aber wir sind aufgrund von Problemen mit der Wiederverwendung von App-Domains weggezogen, und wir möchten nicht, dass unser Worker-Prozess diese Last übernimmt.Langer Prozess in ASP.Net MVC

Derzeit planen wir, eine Befehlszeile C# exe zu erstellen, die die gespeicherte Prozedur ausführen und den CSV-Bericht in einem freigegebenen Ordner vorbereiten kann. Wir werden dann eine ASP.Net MVC-Ansicht haben, von wo aus Benutzer die Befehlszeilen-Exe durch die Methode system.diagnostics.process.start() initiieren kann. Der ASP.NET MVC zeigt den Bericht als herunterladbaren Link an, sobald der Prozess abgeschlossen ist. Wir werden eine Status-DB-Tabelle haben, die die EXE den Status aktualisieren kann, sobald der Prozess abgeschlossen ist, und die Asp.Net MVC-Ansicht kann dies verwenden, um den Status und den herunterladbaren Bericht anzuzeigen.

Gibt es eine bessere Möglichkeit, diese Anforderung zu erfüllen? Danke im Voraus!

Grüße, Bala

+2

Warum entscheidet der Benutzer über technologische Entscheidungen? Aus technologischer Sicht klingt ein Reporting-Service zur Erstellung von Berichten mit langer Laufzeit ausgezeichnet. Warum in Rente gehen? – Maarten

+0

Ein besserer Ansatz besteht darin, dass ein dedizierter Dienst (kein Webdienst) auf Berichtsanforderungen wartet. Verwenden Sie die Nachrichtenwarteschlange, damit die Nachricht beibehalten wird, und geben Sie sie an die Warteschlange zurück, oder entsperren Sie sie für den Fall, dass der Dienst fehlschlägt. 40 Minuten ist ein wirklich langer Prozess, der in Stücke zerlegt werden sollte (CQRS, Workflow, Saga, etc.). – acelent

Antwort

1

Es ist ein gültiger-genug Ansatz, glaube ich. Das Ausführen einer EXE erfordert jedoch eine vollständige Vertrauensumgebung, was im Allgemeinen keine gute Idee ist. Persönlich würde ich stattdessen etwas wie HangFire verwenden.

+0

Danke Chris. Lass mich auch HangFire überprüfen. – Bala

1

Ich würde für den Windows-Service-Ansatz gehen. Der Hauptgrund ist, dass Sie im Auge behalten können, wie viele Instanzen gleichzeitig ausgeführt werden, und wenn nötig, drosseln Sie sie. Sie erhalten nicht die gleiche Art von Kontrolle mit einer exe. Verwenden Sie den gleichen Status, der funktioniert.

Sie haben Recht, dies aus der Web App herauszuhalten, Sie wollen diesen Druck wirklich nicht auf sie ausüben. Sie können den Dienst sogar auf einem anderen Server ausführen, um das Internet leichter zu machen.