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 "";
       }
   }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM