2008-12-04 9 views
9

Mamy HttpHandler, który zajmuje się bezpośrednio postami binarnymi za pośrednictwem HTTP z niestandardowego oprogramowania klienckiego. Oprogramowanie klienta czasami wysyła dane, w wyniku czego IIS 7 odpowiada za pomocą 400 - Bad Request. Ponieważ "400 Bad Request" jest wyjątkowe, ponieważ HTTP.SYS w sposób przezroczysty obsługuje go w trybie jądra bez powiadamiania o żadnym trybie użytkownika, w ASP.NET nie są zgłaszane żadne błędy. Czy jest możliwe przechwycenie tego http 400 w ASP.NET, tak, że mogę zapisać określone dane do strumienia odpowiedzi w tych scenariuszy? Przekierowanie na inną stronę nie jest opcją, ponieważ musi być w bieżącym żądaniu/odpowiedzi.Czy program ASP.NET HttpHandler może obsługiwać protokół HTTP 400 - nieprawidłowe żądanie?

+1

Jeśli to pytanie brzmiało "umieść swoje ulubione dowcipy HTTP.SYS i http 400", odpowiedź na to pytanie otrzyma co najmniej 238 respondentów. – cfeduke

+0

Czy używasz zintegrowanego trybu potoku IIS7 lub trybu klasycznego? Nie jestem pewien, ale możesz * może * być w stanie zobaczyć błąd podczas korzystania z trybu zintegrowanego, ponieważ "wszystko" przechodzi przez potok ASP.NET. W trybie klasycznym myślę, że jesteś SOL. Ale nie jestem pewien. –

Odpowiedz

2

Jeśli wiesz, co jest przyczyną 400, a następnie może być w stanie dostosować zachowanie http.sys poprzez rejestr, aby sobie z tym poradzić:

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

Należy jednak mieć świadomość, że istnieją potencjalne konsekwencje w zakresie bezpieczeństwa i wydajności.

Inną opcją byłoby użycie filtru proxy przed usługami IIS, tym samym przechwytując żądanie, zanim przejdzie dalej.

+0

Błąd pochodzi z nieprawidłowego nagłówka długości treści, który zgodnie z tym: http://technet.microsoft.com/en-us/library/cc786188.aspx nie może być dostosowany. Wygląda na to, że może nie być to możliwe bez podstawowego pisania własnego serwera http w tym momencie. – duckworth

1

Jeśli niestandardowy klient powoduje, że usługi IIS uruchamiają protokół HTTP 400, prawdopodobnie jest on wadliwy i nie przesyła prawidłowych żądań HTTP zgodnie ze standardem. Jeśli możesz zmienić klienta, byłoby to słuszne. W przeciwnym razie to, z czym pracujesz, nie jest protokołem HTTP, a usługi IIS są zaprojektowane do obsługi żądań HTTP. Dlatego powinieneś uruchomić niestandardowy serwer dla swojego własnego protokołu (co jest niestandardową rzeczą podobną do HTTP).

Nie zaleca się używania usług IIS/ASP.NET do obsługi takich żądań, ponieważ może to spowodować dziwne nieoczekiwane zdarzenia.

+0

Błąd wynika z nieprawidłowego nagłówka długości treści z uszkodzonego ładunku. Zmiana oprogramowania klienckiego nie jest opcją i wystarczy wysłać niestandardową odpowiedź http, aby poinformować klienta, aby wyczyścił jego ładunek, ale nie ma możliwości złapania błędu 400 i wysłania klienta. – duckworth

+0

Cokolwiek to jest, potrzebny jest serwer, który obsługuje niestandardowy protokół (= standard z błędami implementacji). Powinieneś prawdopodobnie napisać niestandardowy serwer, który obsługuje ten problem. Myślę, że rozwiązanie filtrowania proxy Dave'a R. to najlepszy pomysł. Każde rozwiązanie jest jednak brzydkie. –

2

Zamiast tego poprosiłbym je o naprawienie niestandardowego oprogramowania klienckiego. Przekaż im raport z nieudanymi żądaniami. Jeśli jesteś w stanie, uruchom sniffer taki jak Wireshark i wyślij pakiety, jeśli nie wierzą, że problem tkwi w ich oprogramowaniu.