Mam sytuację, w której kiedy otrzymuję kod HTTP 400 z serwera, jest to całkowicie legalny sposób, w jaki serwer mówi mi, co było nie tak z moim żądaniem (za pomocą komunikatu w treści odpowiedzi HTTP)
Jednak HttpWebRequest .NET zgłasza wyjątek, gdy kod stanu to 400.
Jak sobie z tym poradzić? Dla mnie 400 jest całkowicie legalne i raczej pomocne. Treść HTTP zawiera pewne ważne informacje, ale wyjątek zrzuca mnie ze ścieżki.
.net
httpwebrequest
szef kuchni
źródło
źródło
Odpowiedzi:
Byłoby miło, gdyby istniał jakiś sposób wyłączenia „wrzuć kod nieudany”, ale jeśli złapiesz WebException, możesz przynajmniej użyć odpowiedzi:
Być może chciałbyś zawrzeć bit „daj mi odpowiedź, nawet jeśli nie jest to kod sukcesu” w osobnej metodzie. (Sugeruję, abyś nadal rzucał, jeśli nie ma odpowiedzi, np. Jeśli nie możesz się połączyć).
Jeśli odpowiedź na błąd może być duża (co jest nietypowe), możesz dostosować
HttpWebRequest.DefaultMaximumErrorResponseLength
ją tak, aby uzyskać cały błąd.źródło
Wiem, że już dawno na nie udzielono odpowiedzi, ale mam nadzieję, że zastosowałem metodę rozszerzenia, aby pomóc innym osobom, które odpowiedzą na to pytanie.
Kod:
Stosowanie:
źródło
WebException.Response
może i może byćnull
. W takim przypadku powinieneś rzucić ponownie.HttpClient
zamiast tego, jest o wiele bardziej konfigurowalne i wierzę, że jest to droga przyszłości.((WebRequest) null).GetResponseWithoutException()
w rzeczywistości nie spowoduje aNullReferenceException
, ponieważ jest skompilowany do odpowiednikaWebRequestExtensions.GetResponseWithoutException(null)
, co nie spowodowałoby aNullReferenceException
, stąd potrzeba weryfikacji danych wejściowych.Co ciekawe, to
HttpWebResponse.GetResponseStream()
, co otrzymujesz z,WebException.Response
nie jest tym samym, co strumień odpowiedzi, który otrzymałeś z serwera. W naszym środowisku tracimy rzeczywiste odpowiedzi serwera, gdy kod statusu 400 HTTP jest zwracany klientowi za pomocąHttpWebRequest/HttpWebResponse
obiektów. Z tego, co widzieliśmy, strumień odpowiedzi powiązany zWebException's HttpWebResponse
generowany jest na kliencie i nie zawiera żadnej treści odpowiedzi z serwera. Bardzo frustrujące, ponieważ chcemy przekazać klientowi wiadomość o przyczynie złej prośby.źródło
Miałem podobne problemy podczas próby połączenia się z usługą Google OAuth2.
W końcu napisałem POST ręcznie, nie używając WebRequest, jak to:
Odpowiedź zapisywana do strumienia odpowiedzi zawiera konkretny tekst błędu, którego szukasz.
W szczególności mój problem polegał na tym, że umieszczałem punkty końcowe między danymi zakodowanymi w adresie URL. Kiedy je wyjąłem, wszystko działało. Możesz być w stanie użyć podobnej techniki, aby połączyć się z usługą i odczytać tekst błędu odpowiedzi.
źródło
Spróbuj tego (to kod VB :-):
źródło
Asynchroniczna wersja funkcji rozszerzenia:
źródło
To rozwiązało dla mnie:
https://gist.github.com/beccasaurus/929007/a8f820b153a1cfdee3d06a9c0a1d7ebfced8bb77
TL; DR:
Problem:
localhost zwraca oczekiwaną treść, zdalny adres IP zmienia treść 400 na „Złe żądanie”
Rozwiązanie:
Dodanie
<httpErrors existingResponse="PassThrough"></httpErrors>
doweb.config/configuration/system.webServer
mnie rozwiązało; teraz wszystkie serwery (lokalny i zdalny) zwracają dokładnie tę samą treść (wygenerowaną przeze mnie) bez względu na adres IP i / lub kod HTTP, który zwracam.źródło