С# - получить ответ от WebRequest и обработать коды состояния

Я пишу систему обновлений для .NET-приложений, и на данный момент я застрял. Я пытаюсь получить файл на удаленном сервере и его содержимом. Для этого я хочу использовать HttpWebRequest для получения содержимого и кода состояния, если операция завершилась с ошибкой.

Я построил функцию, содержащую запрос-коммутатор, и каждая часть запрашивает код состояния и выполняет действие.

Это выглядит следующим образом:

public void AskStatusCode(int code)
{
  switch (code)
  {
  case 404:
     // Do an action
     break;

  case 405:
     // Do an action
     break;
  }
}

Хорошо, вот и все. Теперь я создал HttpWebRequest и HttpWebResponse.

HttpWebRequest requestChangelog = (HttpWebRequest)HttpWebRequest.Create(url);
requestChangelog.Method = "GET";

HttpWebResponse changelogResponse = (HttpWebResponse)requestChangelog.GetResponse();

// Now call the function and set the status code of the response as parameter.
AskStatusCode((int)changelogResponse.StatusCode);

Итак, теория должна работать, но это не так. Он не будет делать никаких действий, которые я помещал в "case" -block для специального кода состояния.

Я удалил файл с удаленного сервера, чтобы проверить, будет ли он выполнять блок case для кода "404" , но он всегда показывает мне исключение (на удаленном сервере ответили 404), но не что я хотел, чтобы этот код состояния обрабатывался.

Итак, мой вопрос: почему это не работает? Типы являются целыми числами, и я также добавил код статуса в Int32, как вы могли видеть...

К вашей информации: после того, как был проверен код состояния, и если все в порядке, я хочу прочитать содержимое с помощью устройства чтения потока и ResponseStream.

Помощь будет оценена по достоинству. Извините, если вы этого не поняли, я попытался сказать это так ясно, как только мог.

Ответ 1

Вы должны проверить, не удался ли ответ из-за ошибки сервера (WebException предоставляет WebResponse) или нет. Возможно, это поможет вам:

        HttpWebResponse response = null;

        try
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com/thisisadeadlink");
            request.Method = "GET";

            response = (HttpWebResponse)request.GetResponse();

            StreamReader sr = new StreamReader(response.GetResponseStream());
            Console.Write(sr.ReadToEnd());
        }
        catch (WebException e)
        {
            if (e.Status == WebExceptionStatus.ProtocolError)
            {
                response = (HttpWebResponse)e.Response;
                Console.Write("Errorcode: {0}", (int)response.StatusCode);
            }
            else
            {
                Console.Write("Error: {0}", e.Status);
            }
        }
        finally
        {
            if (response != null)
            {
                response.Close();
            }
        }

Ответ 2

StatusCodes в диапазоне 4xx и 5xx выкидывают WebException, поэтому код никогда не достигает оператора switch.

Вам нужно обработать это исключение в коде:

HttpWebRequest requestChangelog = null;
HttpWebResponse changelogResponse = null;

try
{
    requestChangelog = (HttpWebRequest)HttpWebRequest.Create(url);
    requestChangelog.Method = "GET";

    changelogResponse = (HttpWebResponse)requestChangelog.GetResponse();
}
catch (WebException we)
{
    //handle the error
}

AskStatusCode((int)changelogResponse.StatusCode);

Если вас интересует только проверка кодов состояния ошибки, вы можете переместить вызов AskStatusCode() внутри блока catch.