С# - получить ответ от 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.