C#使用WebClient时,如果状态码不为200时,如何获取请求返回的内容
一、事故现场
使用WebClient发送请求,如果返回的状态码不是2xx或3xx,那么默认情况下会抛出异常,
那如何才能获取到请求返回的内容呢?
二、解决方法
可以通过try catch获取到WebException类型的异常;
- api接口:
 
   [HttpGet("test")]
   public ActionResult test()
   {
       Response.StatusCode = 401;
       return Content("test");
   }
- 使用WebClient发送请求:
方式一:直接捕获WebException 类型异常; 
   public static string WebClientGetRequest(string url)
   {
       try
       {
           using (WebClient client = new WebClient())
           {
               //设置编码格式
               client.Encoding = System.Text.Encoding.UTF8;
               //获取数据
               var result = client.DownloadString(url);
               return result;
           }
       }
       catch (WebException ex)
       {
           using (HttpWebResponse hr = (HttpWebResponse)ex.Response)
           {
               int statusCode = (int)hr.StatusCode;
               StringBuilder sb = new StringBuilder();
               StreamReader sr = new StreamReader(hr.GetResponseStream(), Encoding.UTF8);
               sb.Append(sr.ReadToEnd());
               Console.WriteLine("StatusCode:{0},Content:{1}", statusCode, sb);// StatusCode:401,Content:test
           }
           return "";
       }
   }
方法二:捕获 Exception 异常,然后再判断异常类型;
   public static string WebClientGetRequest(string url)
   {
       try
       {
           using (WebClient client = new WebClient())
           {
               //设置编码格式
               client.Encoding = System.Text.Encoding.UTF8;
               //获取数据
               var result = client.DownloadString(url);
               return result;
           }
       }
       catch (WebException ex)
       {
           if (ex.GetType().Name == "WebException")
           {
               WebException we = (WebException)ex;
               using (HttpWebResponse hr = (HttpWebResponse)we.Response)
               {
                   int statusCode = (int)hr.StatusCode;
                   StringBuilder sb = new StringBuilder();
                   StreamReader sr = new StreamReader(hr.GetResponseStream(), Encoding.UTF8);
                   sb.Append(sr.ReadToEnd());
                   Console.WriteLine("StatusCode:{0},Content:{1}", statusCode, sb);// StatusCode:401,Content:test
               }
           }
           return "";
       }
   }
        作者:willingtolove 
        
        出处:http://www.cnblogs.com/willingtolove/
        
        本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    
                    
                
                
            
        
浙公网安备 33010602011771号