#c# #.net #http #httpwebrequest
#c# #.net #http #httpwebrequest
Вопрос:
Я пытаюсь получить номер кода состояния HTTP из HttpWebResponse
объекта, возвращаемого из HttpWebRequest
. Я надеялся получить фактические цифры (200, 301,302, 404 и т.д.), а не текстовое описание. («Ok», «MovedPermanently» и т.д.) Скрыто ли это число в свойстве где-нибудь в объекте ответа? Есть идеи, кроме создания большой функции переключения? Спасибо.
HttpWebRequest webRequest = (HttpWebRequest)WebRequest
.Create("http://www.gooogle.com/");
webRequest.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
//Returns "MovedPermanently", not 301 which is what I want.
Console.Write(response.StatusCode.ToString());
Комментарии:
1. Для обратного действия: HttpResponse. HttpStatusCode = (HttpStatusCode)Перечисление. ToObject(typeof(HttpStatusCode), 404))
Ответ №1:
Console.Write((int)response.StatusCode);
HttpStatusCode (тип response.StatusCode
) — это перечисление, значения элементов которого соответствуют кодам состояния HTTP, например
public enum HttpStatusCode
{
...
Moved = 301,
OK = 200,
Redirect = 302,
...
}
Комментарии:
1. но в случае исключения «connectfailure» из webexception я получаю ответ как null, в таком случае, как я могу получить код httpstatus
2. @rusty: если произошел сбой соединения и, следовательно, запрос не может быть отправлен и ответ не может быть получен, никакого кода состояния http не будет.
3. Как получить значение HTTP Substatus ? Например, ссылка на слишком большую длину содержимого 404.13: iis.net/configreference/system.webserver/security /…
4. Бонус:
bool success = ((int)response.StatusCode) >= 200 amp;amp; ((int)response.StatusCode) < 300;
5. @Alain Двойной бонус; bool success = ответ. IsSuccessStatusCode;
Ответ №2:
Вы должны быть осторожны, ответы сервера в диапазоне от 4xx до 5xx вызывают исключение WebException. Вам нужно перехватить его, а затем получить код состояния из объекта WebException:
try
{
wResp = (HttpWebResponse)wReq.GetResponse();
wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}
Комментарии:
1. Я рад, что вы упомянули 4xx и 5xx, потому что у меня возникли проблемы с программой, которая не работала должным образом. Я должен отметить, однако, что текущий . NET framework уведомит вас о любых неперехваченных исключениях, так что это тоже несложно.
2. В качестве бонуса раньше можно было украсить метод [DebuggerNonUserCode], и отладчик не останавливался в этом методе при возникновении исключения. Таким образом, плохо разработанные исключения могут быть обернуты и проигнорированы. Но теперь требуется настройка реестра
Ответ №3:
В соответствии с ‘dtb’ вам нужно использовать HttpStatusCode, но после ‘zeldi’ вам нужно быть особенно осторожным с ответами кода >= 400.
У меня это сработало:
HttpWebResponse response = null;
HttpStatusCode statusCode;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException we)
{
response = (HttpWebResponse)we.Response;
}
statusCode = response.StatusCode;
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
sResponse = reader.ReadToEnd();
Console.WriteLine(sResponse);
Console.WriteLine("Response Code: " (int)statusCode " - " statusCode.ToString());
Комментарии:
1. HttpWebResponse реализует IDisposable, поэтому справиться с этим может быть непросто. Вместо этого вы можете использовать следующее, которое позволяет вам объявлять «ответ» внутри блока using: public HttpWebResponse GetSafeResponse(запрос HttpWebRequest) { try { return (HttpWebResponse)request.GetResponse(); } catch (WebException we) { return (HttpWebResponse)we.Response; } }
Ответ №4:
Просто принудительно используйте StatusCode
to int
.
var statusNumber;
try {
response = (HttpWebResponse)request.GetResponse();
// This will have statii from 200 to 30x
statusNumber = (int)response.StatusCode;
}
catch (WebException we) {
// Statii 400 to 50x will be here
statusNumber = (int)we.Response.StatusCode;
}
Ответ №5:
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)
Комментарии:
1. Это vb.net операционная система использует C#
2. ..и я использую vb. Рад, что этот ответ был здесь.
Ответ №6:
Вот как я справляюсь с такой ситуацией.
//string details = ...
//...
catch (WebException ex)
{
HttpStatusCode statusCode = ((HttpWebResponse)ex.Response).StatusCode;
if (statusCode == HttpStatusCode.Unauthorized)
{
Reconnect();
//...
}
else if (statusCode == HttpStatusCode.NotFound)
{
FileLogger.AppendToLog("[ERROR] Not Found: " details);
}
else
{
FileLogger.AppendToLog("[ERROR] " ex.Message ": " details);
}
}