Получение номера кода состояния Http (200, 301, 404 и т.д.) Из HttpWebRequest и HttpWebResponse

#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);
    }
}