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出错