C#中403响应体对应处理方法不可用问题咨询
解决C# WebRequest无法获取403响应体的问题
嘿,我懂你碰到的糟心事了——用WebRequest发请求时,遇到403状态码直接就抛异常,连响应体内容都拿不到对吧?这其实是WebRequest的默认脾气:它把非2xx的状态码都认定为错误,直接触发WebException,不会给你直接访问响应内容的机会。不过咱们可以从异常里把响应体“捞”出来,下面是具体的解决办法:
核心思路
当捕获到WebException时,重点看异常的Response属性——它本质就是服务器返回的HttpWebResponse对象,我们可以通过它读取响应流,拿到403的响应体内容。
修改后的Catch代码块
把你的catch部分替换成这段代码就行:
catch (WebException ex) { // 先确认异常里包含服务器的响应对象 if (ex.Response is HttpWebResponse errorResponse) { using (StreamReader reader = new StreamReader(errorResponse.GetResponseStream())) { // 读取完整的403响应体 string errorResponseBody = reader.ReadToEnd(); // 这里可以按你的需求处理内容,比如打印日志、解析JSON等 Console.WriteLine("403响应体内容:"); Console.WriteLine(errorResponseBody); } // 记得关闭响应对象释放资源 errorResponse.Close(); } else { // 处理没有返回响应的异常情况 Console.WriteLine($"请求出错:{ex.Message}"); } }
额外小建议
要是你用的是.NET Core/.NET 5及以上版本,真心推荐换成HttpClient来发请求——它不会因为非2xx状态码直接抛异常,不管状态码是啥,你都能直接通过HttpResponseMessage.Content拿到响应体,代码会清爽很多:
using (HttpClient client = new HttpClient()) { var request = new HttpRequestMessage(HttpMethod.Post, WEBSERVICE_URL); request.Headers.Add("Key", _apiKey); request.Headers.Add("Sign", genHMAC()); request.Content = new FormUrlEncodedContent(new Dictionary<string, string> { {"command", "returnBalances"}, {"nonce", nonce.ToString()} }); HttpResponseMessage response = await client.SendAsync(request); // 直接读取响应体,不用管状态码 string responseBody = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) { Console.WriteLine($"请求失败,状态码:{(int)response.StatusCode}"); Console.WriteLine("响应体:" + responseBody); } }
内容的提问来源于stack exchange,提问作者DroneLord
相关产品推荐
相关产品推荐

