1. 首页>
  2. 技术文章>
  3. .net404webrequest得到返回内容

.net404webrequest得到返回内容

8/25/18 8:29:16 AM 浏览 1610 评论 0

.net

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


网友讨论