Eine Alternative zum Erhöhen der maximalen Anforderungslänge ist das Erstellen einer IHttpModule-Implementierung. Verwende den HttpWorkerRequest im BeginRequest-Handler, um ihn vollständig in deinem eigenen Code zu verarbeiten, anstatt dass die Standardimplementierung damit umgehen kann.
Hier ist eine grundlegende Implementierung, die jede Anfrage behandelt, die an eine Datei mit dem Namen "dropbox.aspx" (in einem beliebigen Verzeichnis, ob vorhanden oder nicht) gesendet wird:
%Vor%Sie könnten so etwas verwenden, zum Beispiel, wenn Sie einen Datei-Uploader implementieren und den mehrteiligen Content-Stream so verarbeiten möchten, wie er empfangen wurde. So können Sie die Authentifizierung basierend auf veröffentlichten Formularfeldern und mehr durchführen Wichtig: Löschen Sie die Anfrage auf der Serverseite, bevor Sie überhaupt Dateidaten erhalten. Das kann viel Zeit sparen, wenn Sie früh im Stream feststellen können, dass der Upload nicht autorisiert ist oder die Datei zu groß ist oder das Festplattenkontingent des Benutzers für die Dropbox überschreitet.
Dies ist mit der Standardimplementierung nicht möglich, da beim Versuch, auf die Form-Eigenschaft von HttpRequest zuzugreifen, versucht wird, den gesamten Anforderungsstream mit MaxRequestLength-Prüfungen zu empfangen. Das HttpRequest-Objekt hat eine Methode namens "GetEntireRawContent", die aufgerufen wird, sobald Zugriff auf den Inhalt benötigt wird. Diese Methode beginnt mit dem folgenden Code:
%Vor%Der Punkt ist, dass Sie diesen Code überspringen und stattdessen Ihre eigene benutzerdefinierte Überprüfung der Inhaltslänge implementieren. Wenn Sie Reflector verwenden, um den Rest von "GetEntireRawContent" als Modellimplementierung zu betrachten, sehen Sie, dass es im Wesentlichen Folgendes ausführt: Ruft GetPreloadedEntityBody auf, prüft, ob durch Aufrufen von IsEntireEntityBodyIsPreloade mehr zu laden ist, und führt schließlich Aufrufe durch an ReadEntityBody, um den Rest der Daten zu erhalten. Die von GetPreloadedEntityBody und ReadEntityBody gelesenen Daten werden in einen spezialisierten Stream ausgegeben, der automatisch eine temporäre Datei als Hintergrundspeicher verwendet, sobald er einen Größengrenzwert überschreitet.
Eine grundlegende Implementierung würde so aussehen:
%Vor%An diesem Punkt haben Sie Ihre gesamte Anfrage in einem MemoryStream. Anstatt jedoch die gesamte Anfrage herunterzuladen, habe ich die "bytesRemaining" -Schleife in eine Klasse mit einer "ReadEnough (int max_index)" -Methode ausgelagert, die bei Bedarf von einem spezialisierten MemoryStream aufgerufen wird, der "genügend lädt". in den Stream, um auf das Byte zuzugreifen, auf das zugegriffen wird.
Mit dieser Architektur kann ich schließlich die Anforderung direkt an einen Parser senden, der aus dem Speicherstream liest, und der Speicherstrom lädt bei Bedarf automatisch mehr Daten von der Worker-Anforderung. Ich habe auch Ereignisse implementiert, so dass jedes Element des mehrteiligen Inhaltsstroms geparst wird und Ereignisse ausgelöst werden, wenn jedes neue Teil identifiziert und jedes Teil vollständig empfangen wird.
Tags und Links asp.net