C# HttpClient捕获异常时e.Message仅输出错误码无报错信息如何解决
C# HttpClient调用接口无法获取错误响应详情问题解答
成因
HttpResponseMessage.EnsureSuccessStatusCode()方法的触发逻辑是:只要响应HTTP状态码不在200-299区间,就会直接抛出HttpRequestException,该异常的默认Message属性仅包含状态码和HTTP标准原因短语,不会主动读取响应体内容。- 接口返回的自定义错误描述通常存储在响应报文体(Body)中,原有代码触发异常后直接进入catch块,未执行
response.Content.ReadAsStringAsync()的逻辑,因此无法拿到自定义错误信息。 - Postman的逻辑是无论响应状态码是否为成功类,都会完整读取并展示响应头、响应体所有内容,因此可以看到完整错误信息。
解决方法
推荐的修改方案是:先判断响应状态码,无论成功失败都优先读取响应内容,再做后续处理,示例代码如下:
// HttpClient全局单例的定义保持不变 static readonly HttpClient client = new HttpClient(); static async Task APITest() { HttpResponseMessage response = null; try { response = await client.GetAsync("替换为你的接口地址"); // 先读取响应体内容,不管成功失败都能拿到返回信息 string responseBody = await response.Content.ReadAsStringAsync(); // 再判断状态码是否为成功类 if (response.IsSuccessStatusCode) { Debug.Log("请求成功:" + responseBody); } else { Debug.Log($"请求错误,状态码:{(int)response.StatusCode},错误详情:{responseBody}"); } } catch(Exception e) { // 这里捕获的是网络不通、超时等请求层面的异常,不是接口返回的业务错误 Debug.Log("\n请求异常捕获!"); Debug.Log("异常信息:{0} ",e.Message); // .NET Core 3.0及以上版本可以从HttpRequestException中额外获取状态码 if (e is HttpRequestException httpEx) { Debug.Log($"对应错误状态码:{(int)httpEx.StatusCode}"); } } }
如果一定要保留EnsureSuccessStatusCode()的写法,也可以捕获异常后从预先存储的response对象中读取响应体,但不推荐该做法,因为异常场景下响应流可能已被释放,读取成功率较低。
内容的提问来源于stack exchange,提问作者Mohan Reddy
相关产品推荐
相关产品推荐

