正常情况下,我们使用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(); } }