Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Große Datenmengen in Formularfeldern erfolgreich auslesen

Geschrieben von: Christoph Wille
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Wer lange genug mit ASP arbeitet, lernt die interessantesten Designentscheidungen des Active Server Pages Teams kennen. Eine davon ist, daß das Größenlimit für ein mit ASP auslesbares Formularfeld genau 102,399 Bytes ist. Wer über dieses Limit kommt, den erwartet eine Fehlermeldung - der heutige Artikel zeigt, wie man sich diese ersparen kann.

Der Fehler

Natürlich wollen wir uns den Fehler einmal zuerst "in freier Wildbahn" ansehen. Dazu habe ich ein sehr einfaches Formular erstellt:

<form method="post" action="Postback.asp">
	<textarea name="SampleData" ROWS="10" COLS="60"></textarea><br />
	<input type="submit" value="Abschicken" />
</form>

Ausgelesen wird die Textarea in der Datei postback.asp, die ebenso minimalistisch gehalten ist:

<%
strData = Request.Form("SampleData")
Response.Write Server.HtmlEncode(strData)
%>

Unter normalen Umständen funktioniert alles perfekt, allerdings, sobald die Datenmenge zu groß wird (Beispieldaten sind in der Datei SharpDevelopGerman.xml im Download mit dabei), kommt folgende Fehlermeldung:

Request object, ASP 0107 (0x80004005)
The data being processed is over the allowed limit.
/aspheute/Bigforms/Postback.asp, line 2

Wer also größere Datenmengen per Formularfeld erwartet, der muß vorbauen.

Umgehen des Limits

Es gibt zwei Wege, das Limit zu umgehen: am Client oder am Server. Der Weg am Client führt über JavaScript, und wird im KB Artikel PRB: Error "Request Object, ASP 0107 (0x80004005)" When You Post a Form (Q273482) beschrieben. Diese Lösung hat den Nachteil, daß wenn der User JavaScript ausgeschaltet hat, sie nicht funktioniert. Der universellere Ansatz ist daher der serverseitige.

Vorweg - der Lösungsansatz stammt nicht von mir, sondern von Antonin Foller, und der originale Sourcecode mit Beschreibung kann von Request.Form and stack overflow? downgeloadet werden. Ich habe den vorhandenen Code in folgenden Punkten angepasst: alle Funktionen sind in einer VBScript Klasse EnhancedFormClass gekapselt, und ich habe hier und da an der Performance optimiert.

Die Klasse hat folgende Struktur:

Class EnhancedFormClass
 Public Function GetFormCollection()
 End Function
 
 Private Function DecodeUrlData(ByVal Data)
 End Function
 
 Private Function RSBinaryToString(BinaryData)
 End Function
End Class

Einzig und allein die Methode GetFormCollection ist von außen angreifbar: diese liefert ein Dictionary Objekt zurück, mit dessen Hilfe man auf die dekodierten Daten zugreifen kann - genauso wie mit Request.Form. Intern wird mit Hilfe des ADO Stream Objekts die Dekodierung vorgenommen, die Implementierungsdetails kann man in EnhancedFormClass.asp nachlesen.

Wie sieht die Verwendung aus? Zuerst ein kurzer Blick auf das Formular, das die Daten postet:

<form method="post" action="PostbackEnhanced.asp" enctype="application/x-www-form-urlencoded">
	<textarea name="SampleData" ROWS="10" COLS="60"></textarea><br />
	<input type="submit" value="Abschicken" />
</form>

Die Dekodierroutinen erwarten den Encoding Type (enctype) application/x-www-form-urlencoded, deshalb wird dieser sicherheitshalber explizit mitgegeben. Sonst sind keine Änderungen am Formular vorgenommen, das meiste hat sich in der Datei PostbackEnhanced.asp getan:

<!--#include file="EnhancedFormClass.asp"-->
<%
Set Form = New EnhancedFormClass
Set FormFields = Form.GetFormCollection()

strData = FormFields("SampleData")
Response.Write Server.HtmlEncode(strData)
%>

Zuallererst wird EnhancedFormClass.asp inkludiert, die unsere erweiterte Formularklasse beinhaltet. Danach wird eine Instanz von EnhancedFormClass erstellt, gefolgt vom Zugriff auf die Methode GetFormCollection. Damit haben wir die Collection (Dictionary) der Formularfelder in der Hand, und können auf beliebige Elemente zugreifen. Durch die selbstprogrammierte Dekodierung der Rohdaten tritt der Stack Overflow Fehler nun nie wieder auf.

Schlußbemerkung

Das Formularfeldgrößenlimit ist lästig, kann aber mit Hilfe der vorgestellten Klasse umgangen werden. Einzig die Vorausplanung, ob man mit solchen Datenmengen planen muß (und somit auf diese Klasse umsteigen sollte), bleibt dem Programmierer überlassen.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20020430.zip

Verwandte Artikel

Das Dictionary Objekt - Dein Feind und Helfer
http:/www.aspheute.com/artikel/19990806.htm
Klassen in VBScript
http:/www.aspheute.com/artikel/20000526.htm
Klassenauflistungen mit dem Dictionary-Objekt
http:/www.aspheute.com/artikel/20020408.htm

Links zu anderen Sites

PRB: Error "Request Object, ASP 0107 (0x80004005)" When You Post a Form (Q273482)
http://support.microsoft.com/default.aspx?scid=kb;EN;q273482
Request.Form and stack overflow?
http://www.pstruh.cz/tips/detpg_largepost.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.