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

  • 相关阅读:
    使用rdbtools工具来解析redis rdb文件
    Python三十个常见的脚本汇总
    python字节(bytes)
    Centos7安装MySQL8.0
    shell数组等基本用法
    怎么理解分布式、高并发、多线程?
    MySql 5.7.23安装
    Centos7.5基于MySQL5.7的 InnoDB Cluster 多节点高可用集群环境部署记录
    MySQL会发生死锁吗?
    CentOS7利用systemctl添加自定义系统服务
  • 原文地址:https://www.cnblogs.com/willingtolove/p/12078698.html
Copyright © 2020-2023  润新知