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

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Große Datenmengen in Formularfeldern erfolgreich auslesen

Geschrieben von: Christoph Wille
Kategorie: ASP Tricks

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Das Dictionary Objekt - Dein Feind und Helfer
Klassen in VBScript
Klassenauflistungen mit dem Dictionary-Objekt

Links zu anderen Sites

PRB: Error "Request Object, ASP 0107 (0x80004005)" When You Post a Form (Q273482)
Request.Form and stack overflow?

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.