2009-05-05 7 views
1

Ich habe ein benutzerdefiniertes 404-CMS-System in .NET 3.5 erstellt, und während Daten in IIS 5.1 und 6.0 lokal veröffentlicht werden, funktioniert es auf dem Produktions-IIS 6.0-Server nicht. Ich habe die IIS 6.0-Websiteeinstellungen Element für Element verglichen, und sie sind fast identisch, wobei die einzigen Unterschiede keine Rolle spielen.Warum werden POST-Daten verloren, wenn von einer benutzerdefinierten 404-Seite in IIS 6.0 gesendet wird?

Ich verifiziert, dass das Formular POST-in "http://domain/folder/folder/page.resource" in jedem Fall ist (Code ist in SVN) und keine Umleitungen auftreten, wenn sie gesendet (Ich warf Ausnahmen um sicherzustellen, dass). Einige Debug-Informationen nach Server:

IIS 5.1 (my computer, works): 
ServerVariables["REQUEST_METHOD"]="POST" 
Request.TotalBytes = 1600 
Request.QueryString.Count = 1 (NOTE: contains "404;http://domain:80/folder/folder/page.resource" in each case) 
Request.Form.Count = 109 

IIS 6.0 (test server, works): 
ServerVariables["REQUEST_METHOD"]="GET" (NOTE: IIS 6.0 reads this as "GET" instead of "POST") 
Request.TotalBytes = 1600 
Request.QueryString.Count = 1 
Request.Form.Count = 109 

IIS 6.0 (production server, does not work): 
ServerVariables["REQUEST_METHOD"]="GET" 
Request.TotalBytes = 0 (NOTE: should be ~1600) 
Request.QueryString.Count = 1 
Request.Form.Count = 0 (NOTE: should be 109) 

Hat jemand irgendwelche Ideen? Ich habe gelesen, dass POST-Daten nicht in IIS 7.0 für 404 Seiten, sondern nicht in 6.0 übermittelt wurden. Meine Form ist in diesem Format:

<form id="GolfRegistration" name="GolfRegistration" method="POST" action="/folder/folder/page.resource" onSubmit="return CalculateAmount();"> 
<input type="button" value="Submit" onClick="if(ValidateInput()){submit(GolfRegistration);}"> 
</form> 

Für IIS 5.1 nur, ich Setup die .resource Erweiterung in "IIS> Website> Eigenschaften> Registerkarte Basisverzeichnis> Schaltfläche Konfiguration> Add" mit GET, HEAD zu arbeiten, und POST. Dies verhindert, dass ich beim Senden 405 Fehler erhalte.

Edit: Ich änderte den POST zu GET und in allen 3 Fällen übermittelte es die Daten korrekt, so ist es kein Formproblem. Leider kann ich die Variablen (es gibt 109) in der Querystring nicht übergeben.

+0

Warum das "c" -Tag? – BobbyShaftoe

Antwort

1

Versuchen Sie vorübergehend, die Formularmethode zu GET zu ändern. Dies sollte Ihnen sagen, ob Daten gesendet werden und welche Daten gesendet werden.

Ich bin schon einmal auf ein ähnliches Problem gestoßen, und es war ein Problem mit dem Skript, das den zu sendenden Inhalt erzeugte, anstatt dass die Daten gesendet wurden.

+0

Ich habe es in GET geändert und es sendet die Daten in der Querystring in allen 3 Instanzen. – user101567

2

Ich hatte das gleiche Problem, und leider sieht es aus wie die Antwort ist "das ist ein Feature."

Lesen Sie hier mehr: Ok, ich habe versucht, einen Link auf die Problembeschreibung zu posten, aber es heißt, neue Benutzer können keine Links posten. Also, das Beste, was ich tun kann, ist dies: Machen Sie eine Google-Suche nach "IIS 6: Formular-Post-Daten in 404/405 Custom Error Handler fehlt" (stellen Sie sicher, dass es in Anführungszeichen), und zumindest zum Zeitpunkt meiner dies schreiben Das beste Ergebnis sollte die Seite sein, auf die ich mich bezog.

Zusammengefasst, was passiert ist:

1) Ihre inexistent URL POST'd zu (zB mydomain.com/somepage) 2) IIS empfängt die Anforderung, stellt fest, dass somepage doesn Es ist nicht vorhanden, und es wird dann eine zweite Anforderung an Ihre Fehlerbehandlungsroutine ausgelöst, und die Methode für diese Anforderung ist intern GET. Und keine Ihrer POST-Daten wird weitergegeben.

Das lässt die Frage, warum Sie sind alle mit Erfolg auf IIS 6 - das hat mich verblüfft.

Auf jeden Fall lesen Sie den obigen Link für mehr.

Übrigens, ich verwende PHP auf IIS 6/Windows2003, und ich entdeckte eine interessante Problemumgehung. Während PHP die POST-Variablen nicht wie erwartet von IIS empfängt, hat PHP immer noch Zugriff auf einen rohen Eingabestream, der durch "php: // input" identifiziert wird. Er kann den ursprünglichen Anfragetext von lesen. Dies wird die POST-Variablen in einem unformatierten Format enthalten - ich konnte die parse_str() -Funktion von PHP verwenden, um die POST-Variablen aus dieser rohen Zeichenkette zu entfernen.

So, es könnte möglich sein, etwas Ähnliches in ASP.NET zu tun. Haben Sie versucht, Request.InputStream zu prüfen? Wenn mein Gedächtnis mir richtig dient, gibt es dir einen Strom, von dem du lesen kannst. Vielleicht wird es die rohen POST-Daten haben?

-Josh