You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用HttpClient调用.NET 6 Web API时如何获取BadRequest的多语言错误属性

解决方案

问题根源在response.EnsureSuccessStatusCode():这个方法会在HTTP状态码非2xx时直接抛出HttpRequestException,导致你无法读取BadRequest返回的响应体内容,自然拿不到FR/NL/EN这些多语言错误属性。

要解决这个问题,需要调整请求处理逻辑,手动处理响应状态并优先读取响应体:

步骤1:定义多语言错误接收类

创建对应接口错误返回结构的类:

public class MultilingualError
{
    public string FR { get; set; }
    public string NL { get; set; }
    public string EN { get; set; }
}

步骤2:修改MyHttpRequests.Post方法

调整逻辑,先读取响应体再根据状态码处理:

public static class MyHttpRequests
{
    private static readonly HttpClient client = new HttpClient();
    private const string baseUrl = "myURL"; // 避免变量名和局部变量重复
    
    static MyHttpRequests()
    {
        // 提前设置Accept头,对所有请求生效
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
    
    public static async Task<string> Post(string entryPoint, object dto)
    {
        string url = $"{baseUrl}{entryPoint}";
        string dtoJson = JsonConvert.SerializeObject(dto);
        HttpContent httpContent = new StringContent(dtoJson, Encoding.UTF8, "application/json");

        try
        {
            using(HttpResponseMessage response = await client.PostAsync(url, httpContent))
            {
                // 优先读取响应体,无论状态码是否正常
                string responseBody = await response.Content.ReadAsStringAsync();

                if (response.IsSuccessStatusCode)
                {
                    return responseBody;
                }
                else
                {
                    if (response.StatusCode == HttpStatusCode.BadRequest)
                    {
                        // 反序列化多语言错误并处理
                        var error = JsonConvert.DeserializeObject<MultilingualError>(responseBody);
                        Console.WriteLine($"法语错误: {error.FR}, 荷兰语错误: {error.NL}, 英语错误: {error.EN}");
                    }
                    else
                    {
                        Console.WriteLine($"请求失败,状态码: {response.StatusCode}");
                    }
                    return responseBody;
                }
            }
        }
        catch(HttpRequestException e)
        {
            Console.WriteLine($"请求异常: {e.Message}");
        }

        return string.Empty;
    }
}

步骤3:调用处调整(可选)

如果需要在Api.Testing中区分正常/错误响应,可以修改返回逻辑:

public static class Api
{
    public static async Task<MyResponseDto> Testing()
    {
        string response = await MyHttpRequests.Post(
            "/api/Testing",
            new { /* 参数内容 */ });
        
        try
        {
            return JsonConvert.DeserializeObject<MyResponseDto>(response);
        }
        catch
        {
            // 反序列化失败说明是错误响应,可返回null或自定义错误标识
            return null;
        }
    }
}

关键注意点

  • client.DefaultRequestHeaders.Accept要在HttpClient初始化时设置,避免每次请求后设置导致当前请求不生效
  • 必须先读取响应体再处理状态码,否则异常抛出后无法获取错误内容
  • 可根据业务需求扩展错误处理逻辑,比如将错误信息返回给调用方而非仅打印

内容的提问来源于stack exchange,提问作者TheBoubou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:25:21