Hochladen und Verarbeiten von CSV-Dateien in ASP.NET MVC 4 Architektonischen Überlegungen
Arbeite ich auf einem ASP.NET MVC 4-Anwendung, die Einfuhr und Prozesse einer CSV-Datei. Ich bin mit einem standard-Formular und-controller für den upload. Hier ist ein überblick von dem, was ich Tue, derzeit:
Controller-Logik
public ActionResult ImportRecords(HttpPostedFileBase importFile){
var fp = Path.Combine(HttpContext.Server.MapPath("~/ImportUploads"), Path.GetFileName(uploadFile.FileName));
uploadFile.SaveAs(fp);
var fileIn = new FileInfo(fp);
var reader = fileIn.OpenText();
var tfp = new TextFieldParser(reader) {TextFieldType = FieldType.Delimited, Delimiters = new[] {","}};
while(!tfp.EndOfData){
//Parse records into domain object and save to database
}
...
}
HTML
@using (Html.BeginForm("ImportRecords", "Import", FormMethod.Post, new { @id = "upldFrm", @enctype = "multipart/form-data" }))
{
<input id="uploadFile" name="uploadFile" type="file" />
<input id="subButton" type="submit" value="UploadFile" title="Upload File" />
}
Die import-Datei enthält eine große Anzahl von Datensätzen (Durchschnitt 40K+) und kann einige Zeit dauern, um abzuschließen. Ich würde lieber nicht haben, ein user sitzt in der import-Bildschirm-für 5+ Minuten für jede verarbeitete Datei. Ich habe als Zugabe eine Konsole-Anwendung zu beobachten, den uploads-Ordner für neue Dateien, und der Prozess, wenn etwas neues Hinzugefügt wird, aber würde gerne sehen, welchen input bekomme ich von den die Gemeinschaft vor Anfang meiner Reise auf diesem Weg.
Ist es ein effizienter Weg, um diese zu bewältigen Betrieb?
Gibt es eine Möglichkeit, um diese Aktion auszuführen, so dass der Anwender weiterhin über seine/Ihre fröhliche Art und Weise, und dann den Benutzer benachrichtigt, wenn die Bearbeitung fertig ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung für das Problem, das ich hatte ist ein bisschen kompliziert, aber funktioniert ähnlich wie der IFrame-fix. Das Ergebnis ist ein pop-up-Fenster, die der Verarbeitung, so dass der Anwender weiterhin die navigation durch die Website.
Die Datei an den server gesendet wird (UploadCSV-controller), eine "Success" - Seite zurückgegeben wird, mit ein bisschen JavaScript zu handhaben, die erste kick-off der Verarbeitung. Wenn der Benutzer klickt auf "Start Verarbeitung", ein neues Fenster wird geöffnet (ImportProcessing/Index), das laden des Anfangsstatus (kicking off ein Intervall-Schleife zum abrufen von status-updates) und macht dann einen Aufruf an die "StartProcessing" - Aktion zum Auftakt der Verarbeitung.
Den "FileProcessor" - Klasse, die ich verwende, ist untergebracht in einem statischen dictionairy variable innerhalb der ImportProcessing-controller, so dass für den status Ergebnisse auf Basis der-Taste. Der FileProcessor ist unverzüglich entfernt werden, nachdem der Vorgang abgeschlossen ist oder ein Fehler aufgetreten ist.
Upload Controller:
Hochladen erfolgreich HTML:
Einmal das neue Fenster wird geöffnet, die Datei beginnt die Verarbeitung. Updates abgerufen werden, die eine benutzerdefinierte FileProcessing Klasse.
ImportProcessing Controller:
ImportProcessing Index:
Schließlich den Status Checker html:
Nur ein Gedanke, aber man könnte Threads, die die Verarbeitung von CSV-Dateien und nach Fertigstellung der Aufgabe eine andere Methode aufgerufen werden, die im Grunde bietet ein modales Dialogfeld oder eine Art von alert in javascript auf der client-Seite lassen den Benutzer wissen, dass die Verarbeitung abgeschlossen wurde.
oder etwas entlang jenen Linien. Ich denke, dass letztendlich Sie gonna wollen Blick auf einige Art von threading, da es sicherlich keinen Sinn für einen Benutzer zu stecken, schaut auf einen Bildschirm, während eine Art von server-side-Verarbeitung stattfindet.