Umfangreiche Formulare in einer Windows 2003 IIS 6.0 - Intranet-Umgebung nicht verarbeitbar

07/03/2008 - 01:20 von jubu66 | Report spam
Hallali,

Habe ein größeres Problem mit umfangreichen Formularen in einer
Windows2003 IIS-Intranet-Umgebung. Habe schon so ziemlich alle Dinge,
die mir bzgl. des empfangenden Skriptes (Basis: Perl) eingefallen sind
ausprobiert und denke daher, dass es primàr an irgendwelchen
Einstellungen in Windows 2003 bzw. am IIS 6.0 liegt.

Seltsam ist, dass das geschilderte Problem mit einem IIS 4.0 zusammen
mit Windows NT nicht auftritt.

Das Problem (wird nachfolgend geschildert) sieht tendenziell nach
einem Speicherplatzproblem von Windows 2003 bzw. von IIS 6.0 aus.
Letztlich würde dies bedeuten, dass pro an den IIS 6.0 übergebenen
Prozess "nur" soundsoviel Bytes zur Verfügung gestellt werden.
Möglicherweise kann dieser Wert irgendwo im IIS oder in Windows 2003
manipuliert werden.

Würde mich freuen, wenn irgendjemand einen Tipp zur Behebung des
Problems hàtte.


Im Einsatz ist ein Windows Server 2003 (Microsoft Windows [Version
5.2.3790]) Hauptspeicher 4 GB
Microsoft Internet Information Server 6.0
ActiveStatePerl v5.6.1 built for MSWin32-x86-multi-thread Binary build
633
provided by ActiveState Corp. http://www.ActiveState.com Built
21:33:05 Jun 17 2002



Hier die genaue Problembeschreibung:
Wenn an den MIIS6 (Microsoft Internet Information Server Version6)
Server
Formularwerte übergeben werden (so wie nachfolgend dargestellt)

<form name="form1" method="post" action="env3.pl">
.
.
.
<input type="submit" name="Submit" value="Anzeigen">

dann funktioniert dies bei Formularen, die wenig umfangreich sind.

Sobald jedoch das Formular zu viele Formularfelder enthàlt bzw. der
Inhalt der Formularwerte zu umfangreich wird, hàngt sich das
empfangende Skript auf.
Ein Beispiel für ein empfangendes Skript:
#!/usr/bin/perl -w

use strict;
use warnings;
$|=1;

print "Content-type:text/html";

foreach my $var (sort keys %ENV) {
print $var . "=" . $ENV{$var} . "<br>";
}

Wird im empfangenden Skript lediglich (als Beispiel) "Hallo Welt"
angezeigt, dann funktioniert die Sache (also: Es wird "Hallo Welt"
angezeigt).

#!/usr/bin/perl -w

use strict;
use warnings;
$|=1;

print "Content-type:text/html";
print 'hallo welt';

Evtl. existiert irgendwo eine Einstellmöglichkeit, welches entweder
den Umfang der zu übergebenden Formularwerte begrenzt bzw. welches den
Umfang der empfangbaren Werte eines Perl-Skriptes regelt (wobei ich
hier schon verschiedenste Einstellungen ohne Erfolg ausprobiert habe).

Nachfolgend ein Beispiel für ein umfangreiches (wenn auch wenig
sinnvolles) Testformular:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>TEST</title>
<meta http-equiv="Content-Type" content="text/html;
<link href="/xyz/xyz.css" rel="stylesheet" type="text/css">
</head>

<body bgcolor="#FFFFFF">
<form name="form1" method="post" action="env3.pl">
<p class="HAUPTUEBERSCHRIFT"><font face="Arial, Helvetica,
sans-serif"><strong>Test</strong></font></p>
<table width="350" border="0" cellspacing="0" cellpadding="5">
<tr>
<td colspan="3" class="tabletextueberschrift">Auswahl</td>
<td class="tabletextueberschrift"><div align="right"></div></td>
</tr>
<tr class="text">
<td valign="bottom" class="textfett">&nbsp;</td>
<td class="text">&nbsp;</td>
<td valign="bottom" class="text"><input type="text"
name="textfield"></td>
<td valign="bottom" class="text">&nbsp;</td>
</tr>
<tr class="text">
<td valign="bottom" class="textfett">&nbsp;</td>
<td class="text">&nbsp;</td>
<td valign="bottom" class="text"><input type="text"
name="textfield2"></td>
<td valign="bottom" class="text">&nbsp;</td>
.
.
.
<tr class="text">
<td valign="bottom" class="textfett">&nbsp;</td>
<td class="text">&nbsp;</td>
<td valign="bottom" class="text"><input type="text"
name="textfield203"></td>
<td valign="bottom" class="text">&nbsp;</td>
</tr>
<tr class="text">
<td width="23" valign="bottom" class="textfett">&nbsp;</td>
<td class="text"><input type="submit" name="Submit"
value="suchen"></td>
<td valign="bottom" class="text"> <div align="left">
<input type="reset" name="Submit2"
value="Zur&uuml;cksetzen">
</div></td>
<td valign="bottom" class="text"> <div align="right"></div></td>
</tr>
</table>
</form>

</body>
</html>

Dieses Formular ist absolut "sauberer" HTML-Code, so dass Fehler, die
durch
unsauberen Code möglicherweise erzeugt werden könnten auszuschließen
sind.
Es werden 204 Formularwerte textfield, textfield1, textfield2, ...
textfield203 zur Verfügung gestellt.

Dieses Formular ruft die env3.pl auf. Es ist zwar überflüssig
innerhalb desPerl-Skriptes die übergebenen Formularwerte mit "my" zu
deklarieren.
Trotzdem, um wirklich alles auszuschließen, was zu irgendwelchen
Problemen führen könnte, habe ich diese Deklaration vorgenommen.

#!/usr/bin/perl -w
#
# env3.pl
#
use strict;
use warnings;
$| = 1;
my $textfield=0;
my $textfield1=0;
my $textfield2=0;
.
.
.
my $textfield203=0;

my $A_NR_POSITION = 0;

my $Submit = 'suchen';
my $Submit2= 'zurücksetzen';


print "Content-type:text/html";

foreach my $var (keys %ENV)
{
$A_NR_POSITION = $A_NR_POSITION + 1;
print 'Position '.$A_NR_POSITION.'|Var='.$var.'|'.$ENV{$var}."<br>
";
}

Auch die env3.pl ist (meine Meinung) "sauberer" Code.
Sàmtliche Variablen werden deklariert. Trotzdem "làuft" das Skript
nicht durch, sondern muss gekillt werden. Nachdem das Skript gekillt
wurde, sieht man, wie weit es tatsàchlich "lief".
Nàmlich bis zu Position 35.

Werden statt 204 Formularwerte "nur" z. B. 150 Formularwerte
übergeben, dann "làuft" das Skript durch.

Es sieht tendenziell nach einem Speicherplatzproblem aus. Letztlich
würde dies bedeuten, dass pro Perl-Skript/Prozess "nur" soundsoviel
Bytes zur Verfügung gestellt werden. Möglicherweise kann dieser Wert
irgendwo im IIS oder in Windows 2003 manipuliert werden evtl. auch
irgendwo in Perl (???).

Setze ich in das env3.pl-Skript folgende BegrenzungsWerte ein, "làuft"
die Sache bis Position 36.

use CGI qw/:standard/;
$CGI::POST_MAX = 4096 * 100; # maximal 100K Postings
$CGI::DISABLE_UPLOADS = 1; # keine Uploads

Weitere Werteerhöhungen (z. B.: von 4096 auf 8192) haben keinen Effekt.
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
07/03/2008 - 02:00 | Warnen spam
Hallo ?,

schrieb:

Habe ein größeres Problem mit umfangreichen Formularen in einer
Windows2003 IIS-Intranet-Umgebung.



was heißt umfangreich?

Seltsam ist, dass das geschilderte Problem mit einem IIS 4.0 zusammen
mit Windows NT nicht auftritt.



Ältere IIS Versionen kennen bestimmte Limits wie MaxRequestEntityAllowed
noch nicht. http://msdn2.microsoft.com/en-us/library/ms524953(VS.85).aspx
Such mal in der metabase.xml nach MaxRequestEntityAllowed und àndere den
Wert. Ggfs. musst Du in der IIS MMC noch die direkte Bearbeitung der
Metabasis erlauben (Einstellung auf Serverebene, hab nur grad leider
keinen IIS 6 zur Hand um dir die genaue Position anzugeben).

BTW: Darum dürften auch Uploads von Dateien > 200kb fehlschlagen.

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen