C # HttpWebResponse, WebException

Итак, я новичок в C #, но работал с другими языками. В настоящее время я пишу пользовательский лаунчер MineCraft. Я использую документацию по аутентификации Yggdrasil, чтобы помочь мне в этом. В нем говорится: Если запрос был успешным, сервер ответит:

  • Код состояния 200
  • Словарь в кодировке JSON в соответствии со спецификациями ниже

Если, однако, запрос не удастся, сервер ответит:

  • Соответствующий код состояния HTTP, отличный от 200
  • Словарь в кодировке JSON следующего формата:

Я решил первую часть, но во второй части проблема!

HttpWebResponse httpResponse = null;
try
{
    httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        string result = streamReader.ReadToEnd();
        Console.WriteLine(result);
    }
}
catch (WebException e)
{
    Console.WriteLine(e.ToString());
}

Как видите, если возникает WebException, например, я получаю ошибку 403 Forbidden, я не могу прочитать содержимое. Я просто получаю исключение NullReferenceException.

Итак, вопрос: как получить WebResponse в случае сбоя HttpWebRequest?


person Uranium Developers    schedule 24.04.2015    source источник
comment
Можете ли вы открыть скрипач и увидеть ответ клиента?   -  person Yuval Itzchakov    schedule 24.04.2015


Ответы (3)


Вы по-прежнему можете читать содержимое ответа, используя свойство WebException.Response:

HttpWebResponse httpResponse = null;
try
{
    httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        string result = streamReader.ReadToEnd();
        Console.WriteLine(result);
    }
}
catch (WebException e)
{
   Console.WriteLine(e.ToString());

   string responseText;
   using (var reader = new StreamReader(webException.Response.GetResponseStream()))
   {
       responseText = reader.ReadToEnd();
   }

   Console.WriteLine("WebException caught. Response text is {0}", responseText);
}
person Bojan Komazec    schedule 24.04.2015

Пожалуйста, проверьте приведенный ниже метод, чтобы получить код состояния.

     HttpWebResponse httpResponse = null;
    try
    {
        httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            string result = streamReader.ReadToEnd();
            Console.WriteLine(result);
        }
    }
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        var response = ex.Response as HttpWebResponse;
        if (response != null)
        {
            Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
        }
        else
        {
            // no http status code available
        }
    }
    else
    {
        // no http status code available
    }
}
person Rad    schedule 24.04.2015

вы можете попробовать что-то вроде этого:

        var response = e.Response as HttpWebResponse;
         if (response!=null && response.StatusCode != HttpStatusCode.OK)
        {
            Console.WriteLine("HTTP Error Code is: " + (int)response.StatusCode);
        }
person Technovation    schedule 24.04.2015