C# HttpWebResponse, WebException

Posted

技术标签:

【中文标题】C# 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 并实际看到客户端的响应吗? 【参考方案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);
        

【讨论】:

以上是关于C# HttpWebResponse, WebException的主要内容,如果未能解决你的问题,请参考以下文章

(58)C#里怎么判断HttpWebResponse的返回码

(58)C#里怎么判断HttpWebResponse的返回码

c# winform httpWebResponse post出错

c# HttpWebResponse判断返回请求的问题

C#使用HttpWebRequest发送数据和使用HttpWebResponse接收数据的一个简单示例

如何处理C#的HttpWebResponse的GetResponse中的超时异常