C#Post方法GetResponse抛出异常后获取状态码和返回的信息

先描述一下问题产生,对接华为云接口时,由于返回请求错误,对方服务器返回400,415,等错误,然而这种异常内包含某些对方返回的信息,普通的如果post方法内未进行Response的异常处理,那么恭喜你,你悲剧了,获取到的信息就是这些“Exception:远程服务器返回错误: (500) 内部服务器错误”。然而这并不是我们想要的,那么就需要对这种情况进行处理了。

复制代码
 public static string HttpPost(string url, string data, Hashtable ht, out int stateCode)
    {
        HttpWebRequest httpWebRequest = null;
        HttpWebResponse httpWebResponse = null;
        StreamReader streamReader = null;
        stateCode = 0;
        try
        {
            ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
            httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(data);
            httpWebRequest.Method = "POST";
            httpWebRequest.ContentType = "application/json;charset=UTF-8;";
            httpWebRequest.ContentLength = bs.Length;
            if (ht != null && ht.Count > 0)
            {
                foreach (DictionaryEntry dic in ht)
                {
                    httpWebRequest.Headers.Add(dic.Key.ToString(), dic.Value.ToString());
                }
            }
            httpWebRequest.Timeout = 20000;
            httpWebRequest.GetRequestStream().Write(bs, 0, bs.Length);
            httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            streamReader = new StreamReader(httpWebResponse.GetResponseStream(), System.Text.Encoding.UTF8);
            string responseContent = streamReader.ReadToEnd();
            stateCode = (int)(httpWebResponse.StatusCode);
            streamReader.Close();
            httpWebResponse.Close();
            httpWebRequest.Abort();
            return responseContent;
        }
        catch (WebException e)
        {
            string result = string.Empty;
            using (WebResponse response = e.Response)
            {
                HttpWebResponse httpResponse = (HttpWebResponse)response;
                stateCode = (int)httpResponse.StatusCode;
                if (response == null)
                {
                    return e.ToString();
                }

                using (Stream stream = response.GetResponseStream())
                using (var reader = new StreamReader(stream))
                {
                    result = reader.ReadToEnd();
                }
            }
            if (streamReader != null) streamReader.Close();
            if (httpWebRequest != null) httpWebRequest.Abort();
            if (httpWebResponse != null) httpWebResponse.Close();
            return result;
        }
    }
复制代码

 

posted @   极客船长  阅读(2024)  评论(1编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示