2008-12-04 8 views
9

Wir haben einen HttpHandler, der direkt mit binären Posts über HTTP von benutzerdefinierten Client-Software handelt. Die Client-Software sendet gelegentlich Daten, die dazu führen, dass IIS 7 mit einer 400 - Fehleranforderung antwortet. Da die "400 Bad Request" speziell darin ist, dass HTTP.SYS es transparent im Kernel-Modus handhabt, ohne den Benutzermodus von irgendetwas zu benachrichtigen, werden in ASP.NET keine Fehler ausgelöst. Ist es möglich, dieses http 400 in ASP.NET abzufangen, damit ich in diesen Szenarien bestimmte Daten in den Antwort-Stream schreiben kann? Eine Weiterleitung zu einer anderen Seite ist keine Option, da sie in der aktuellen Anfrage/Antwort enthalten sein muss.Kann ein ASP.NET HttpHandler ein http 400 - Bad Request behandeln?

+1

Wenn diese Frage "Ihre Lieblings-HTTP.SYS und http 400 Witze hier setzen" würde es von mindestens 238 Befragten jetzt beantwortet werden. – cfeduke

+0

Verwenden Sie den integrierten Pipeline-Modus oder den klassischen Modus von IIS7? Ich bin mir nicht sicher, aber Sie * können * in der Lage sein, den Fehler zu sehen, wenn Sie den integrierten Modus verwenden, da "alles" die ASP.NET-Pipeline durchläuft. Im klassischen Modus denke ich, du bist SOL. Aber ich bin mir nicht sicher. –

Antwort

2

Wenn Sie wissen, was die 400 verursacht, dann können Sie in der Lage, das Verhalten von http.sys über die Registrierung damit umgehen gestalten:

http://support.microsoft.com/kb/820129

Allerdings sollten Sie sich bewusst sein, dass Es gibt potentielle Auswirkungen auf Sicherheit und Leistung.

Eine andere Option wäre, einen Filter-Proxy vor IIS zu verwenden, um die Anfrage zu erfassen, bevor sie weiter geht.

+0

Der Fehler stammt von einem ungültigen Header für die Inhaltslänge, der laut http://technet.microsoft.com/en-us/library/cc786188.aspx nicht angepasst werden kann. Es sieht so aus, als wäre es vielleicht nicht möglich, ohne dass Sie im Grunde Ihren eigenen http-Server schreiben müssen. – duckworth

1

Wenn Ihr benutzerdefinierter Client bewirkt, dass IIS HTTP 400 auslöst, ist es wahrscheinlich fehlerhaft und sendet keine gültigen HTTP-Anforderungen gemäß dem Standard. Wenn Sie den Client ändern können, wäre es das Richtige. Ansonsten arbeiten Sie nicht mit HTTP und IIS ist für die Verarbeitung von HTTP-Anforderungen ausgelegt. Daher sollten Sie einen benutzerdefinierten Server für Ihr eigenes Protokoll ausführen (was eine nicht standardmäßige HTTP-ähnliche Sache ist).

Es wird nicht empfohlen, IIS/ASP.NET zu verwenden, um eine solche Anfrage zu bearbeiten, da dies zu merkwürdigen unerwarteten Ereignissen führen kann.

+0

Der Fehler ist auf einen ungültigen Header für die Inhaltslänge von einer beschädigten Nutzlast zurückzuführen. Das Ändern der Client-Software ist keine Option und ich muss nur eine benutzerdefinierte http-Antwort senden, um den Client zu informieren, seine Nutzlast zu löschen, aber es gibt keine Möglichkeit für mich, den 400-Fehler einzufangen und dem Client irgendetwas zu senden. – duckworth

+0

Was auch immer es ist, was Sie brauchen, ist ein Server, der das Nicht-Standard-Protokoll (= Standard mit Implementierungsfehlern) behandelt. Sie sollten wahrscheinlich einen benutzerdefinierten Server schreiben, der dieses Problem behandelt. Ich denke, Dave R. Proxy-Filter-Lösung ist die beste Idee. Jede Lösung ist trotzdem ein hässlicher Hack. –

2

Ich würde sie stattdessen bitten, die benutzerdefinierte Client-Software zu beheben. Geben Sie ihnen einen Bericht mit den fehlgeschlagenen Anfragen. Wenn Sie dazu in der Lage sind, führen Sie einen Sniffer wie Wireshark aus und senden Sie ihm die Pakete, wenn Sie nicht glauben, dass das Problem bei seiner Software liegt.