2012-03-30 11 views
6

Eine Clientseite verwendet Javascript, um mehrteilige Formulardaten (Dateien) an meine ASP.NET-Site (ashx-Handler) zu senden.Verarbeitung großer gleichzeitiger HTTP-POSTs in ASP.NET-Anwendung

Der Benutzer wählt mehrere Dateien aus und startet einen gleichzeitigen Upload. Wenn Dateien 150 MB + groß sind, werden mehrere gleichzeitige POST-Handler auf der ASP.NET-Serverseite generiert.

Ich habe die Sitzungssteuerung implementiert, zusammen mit Captcha-Funktionalität, um genau zu wissen, ob es kein Bot ist, der meinen Server überschwemmt.

Aber das Problem ist mit dem ersten Upload-Start.

Jedes Mal, wenn ein Handler ein POST zu verarbeiten ist, prüft sie eine Kennung der Sitzung (meine benutzerdefinierte Sitzung, ein pro Benutzerseite), und fügt die Request.ContentLength Größe auf die Gesamtgröße der Dateien POST ed pro Sitzung. Diese Daten werden in einem XML gespeichert.

Da jedoch mehrere initiale Posts gleichzeitig auftreten, "quillt" ein XML-Writer, der die Summe der Bytes aufzeichnet, 0 Bytes pro Sitzung für alle initialen POST s, da sie zur gleichen Zeit eingehen.

Ich habe implementiert lock auf meinem persister Objekt (das XML-Schreiben tut), aber jetzt, bis ein POST vollständig verarbeitet wird, können andere nicht weitergehen.

Auch wenn ich nichts mit den Anfragen "nach dem Upload-Limit" mache, nehmen sie sich trotzdem Zeit, um die Daten auf den Server hochzuladen.

Also meine Fragen sind:

Was ist das richtige Muster mehrere gleichzeitige POST Uploads zu verarbeiten?

Gibt es eine Möglichkeit, POST sofort zu löschen, sobald die Anforderung im ASP.NET-Handlercode gefiltert wird, und den Client zu speichern, um die Daten in IIS hochzuladen?

UPDATE: Wenn lock nur auf XML schreiben/max Sitzungslänge Berechnung Ich habe immer noch die Nebenläufigkeit, die gut ist. Jetzt muss ich nur herausfinden, wie man die Sitzung sofort aus dem Aschx-Handler-Code löscht.

+0

Sind alle HTTP-Anfragen auf die gleiche Datei zu schreiben? Klingt nach schlechtem Design. Möglicherweise müssen Sie einen Message Queuing-Dienst verwenden, um sich darum zu kümmern. Es ist auch ratsam, die Daten in einer Datenbank zu speichern. – deostroll

+0

Dies ist insbesondere der Fall, wenn in derselben Sitzung (dh im selben Ordner) zwei gleichnamige Dateien gespeichert werden. Wie für die Datenbank - es ist eine großartige Idee, aber HttpPostedFile hat eine SaveAs-Methode, die einen Pfad auf einem Dateisystem einnimmt. Ich habe nicht untersucht, wie veröffentlichte Dateien in DB mit ASP.NET serialisieren. –

Antwort

Verwandte Themen