Я нахожусь в ситуации, когда я получаю код HTTP 400 с сервера, это совершенно законный способ, когда сервер сообщает мне, что случилось с моим запросом (используя сообщение в содержимом ответа HTTP)
Однако .NET HttpWebRequest вызывает исключение, когда код состояния равен 400.
Как мне справиться с этим? Для меня 400 вполне законно и довольно полезно. Содержимое HTTP содержит некоторую важную информацию, но исключение сбивает меня с пути.
.net
httpwebrequest
chefsmart
источник
источник
Ответы:
Было бы неплохо, если бы был какой-то способ отключить «бросить на неуспешный код», но если вы перехватываете WebException, вы можете по крайней мере использовать ответ:
Возможно, вы захотите заключить бит «получите ответ, даже если это не код успеха» в отдельный метод. (Я бы посоветовал вам все равно бросить, если нет ответа, например, если вы не можете подключиться.)
Если реакция на ошибку может быть большой (что необычно), вы можете настроить ее,
HttpWebRequest.DefaultMaximumErrorResponseLength
чтобы убедиться, что вы получите всю ошибку.источник
Я знаю, что на это уже давным-давно ответили, но я сделал метод расширения, чтобы, надеюсь, помочь другим людям, которые приходят на этот вопрос.
Код:
Использование:
источник
WebException.Response
может и может бытьnull
. Вы должны сбросить, если это так.HttpClient
вместо этого, это гораздо более настраиваемый, и я считаю, что это путь в будущее.((WebRequest) null).GetResponseWithoutException()
на самом деле не вызовет aNullReferenceException
, так как он скомпилирован в эквивалентWebRequestExtensions.GetResponseWithoutException(null)
, который не приведет к aNullReferenceException
, следовательно, требуется проверка входных данных.Интересно,
HttpWebResponse.GetResponseStream()
что то, что вы получаете от,WebException.Response
не совпадает с потоком ответов, который вы получили бы от сервера. В нашей среде мы теряем фактические ответы сервера, когда код состояния HTTP 400 возвращается клиенту с помощьюHttpWebRequest/HttpWebResponse
объектов. Из того, что мы видели, поток ответов, связанный с,WebException's HttpWebResponse
генерируется на клиенте и не содержит тела ответа от сервера. Очень расстраивает, так как мы хотим сообщить клиенту причину плохого запроса.источник
У меня были похожие проблемы при попытке подключиться к сервису Google OAuth2.
Я закончил писать POST вручную, не используя WebRequest, например так:
Ответ, который записывается в поток ответов, содержит конкретный текст ошибки, который вы ищете.
В частности, моя проблема заключалась в том, что я помещал конечные строки между фрагментами данных, закодированными в URL. Когда я их вынул, все работало. Возможно, вы сможете использовать аналогичную технику для подключения к вашей службе и чтения фактического текста ошибки ответа.
источник
Попробуйте это (это VB-код :-):
источник
Асинхронная версия функции расширения:
источник
Это решило это для меня:
https://gist.github.com/beccasaurus/929007/a8f820b153a1cfdee3d06a9c0a1d7ebfced8bb77
TL; DR:
Проблема:
LOCALHOST возвращает ожидаются содержание, удаленный IP изменяет содержание 400 «Bad Request»
Решение:
Добавление
<httpErrors existingResponse="PassThrough"></httpErrors>
кweb.config/configuration/system.webServer
решить это для меня; теперь все серверы (локальные и удаленные) возвращают один и тот же контент (созданный мной) независимо от того, какой IP-адрес и / или HTTP-код я возвращаю.источник