【问题标题】:C# HttpWebResponse, WebExceptionC# HttpWebResponse, WebException
【发布时间】:2015-04-24 07:20:24
【问题描述】:

所以,我是 C# 的新手,但我使用过其他语言。 目前我正在编写一个自定义的 MineCraft 启动器。 我正在使用Yggdrasil Authentication Documentation 来帮助我做到这一点。 它说: 如果请求成功,服务器将响应:

  • 状态码 200
  • 符合以下规范的 JSON 编码字典

如果请求失败,服务器将响应:

  • 适当的非 200 HTTP 状态代码
  • 遵循此格式的 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。

那么,问题来了:如果HttpWebRequest失败,如何获取WebResponse?

【问题讨论】:

  • 你能打开 fiddler 并实际看到客户端的响应吗?

标签: c# json httpwebrequest httpwebresponse system.net.webexception


【解决方案1】:

您仍然可以使用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);
}

【讨论】:

    【解决方案2】:

    请查看以下方法获取状态码。

         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
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

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

      【讨论】:

        猜你喜欢
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2015-05-22
        • 1970-01-01
        相关资源
        最近更新 更多