正常情况下,我们使用WebRequest请求一个页面或接口,返回得到内容,代码类似如下:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse rsp = req.GetResponse() as HttpWebResponse;
如果这个时候出现404,就会出现下面截图的情况:

并且上面的两句代码会在
HttpWebResponse rsp = req.GetResponse() as HttpWebResponse
这里就报错了,网上有一种解决方法是说使用StatusCode判断,代码类似这样:
rsp = req.GetResponse() as HttpWebResponse;
if (rsp.StatusCode == HttpStatusCode.NotFound)
{
//do something
}此种方法根本就不可行,正确的做法如下:
try
{
rsp = req.GetResponse() as HttpWebResponse;
}
catch (WebException ex)
{
rsp = ex.Response as HttpWebResponse;
}
Encoding encoding = GetResponseEncoding(rsp);
return GetResponseAsString(rsp, encoding);此种做法就能得到404之后返回的JSON或者其它内容了,补充下用的另外两个方法:
private Encoding GetResponseEncoding(HttpWebResponse rsp)
{
string charset = rsp.CharacterSet;
if (string.IsNullOrEmpty(charset))
{
charset = Constants.CHARSET_UTF8;
}
return Encoding.GetEncoding(charset);
}
/// <summary>
/// 把响应流转换为文本。
/// </summary>
/// <param name="rsp">响应流对象</param>
/// <param name="encoding">编码方式</param>
/// <returns>响应文本</returns>
public string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
{
Stream stream = null;
StreamReader reader = null;
try
{
// 以字符流的方式读取HTTP响应
stream = rsp.GetResponseStream();
if (Constants.CONTENT_ENCODING_GZIP.Equals(rsp.ContentEncoding, StringComparison.OrdinalIgnoreCase))
{
stream = new GZipStream(stream, CompressionMode.Decompress);
}
reader = new StreamReader(stream, encoding);
return reader.ReadToEnd();
}
finally
{
// 释放资源
if (reader != null) reader.Close();
if (stream != null) stream.Close();
if (rsp != null) rsp.Close();
}
}