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

跨Web应用如何获取HttpRequestException中的值?

跨Web应用传递错误:如何从HttpRequestException中拿到自定义错误信息

嘿,我来帮你搞定这个问题~首先得搞明白一个关键点:默认情况下,HttpClient抛出的HttpRequestException不会自动带上你发送端返回的ApiError详情——它只会告诉你“请求失败了”,但不会帮你解析响应体里的自定义错误内容。所以咱们得调整接收端的处理逻辑,才能拿到发送端传过来的具体错误值。

方法一:先拿响应,手动检查状态码再解析(首推)

这种方式更可控,把业务错误和网络异常分开处理,避免依赖异常来做业务逻辑:

// 接收端修改后的请求代码示例
using var client = new HttpClient();
try
{
    // 先拿到完整的响应对象,不要直接用EnsureSuccessStatusCode()自动抛异常
    var response = await client.GetAsync(requestUri); // 换成你实际用的PostAsync/PutAsync等
    
    // 如果状态码不是成功状态,手动解析发送端的ApiError
    if (!response.IsSuccessStatusCode)
    {
        // 把响应内容反序列化成你的ApiError对象(确保两端ApiError类定义完全一致)
        var apiError = await response.Content.ReadAsAsync<ApiError>();
        
        // 这里可以把错误详情完整打日志
        this.logger.LogError(
            "请求{Uri}出错:状态码{StatusCode},错误信息:{ErrorMsg}",
            requestUri.AbsoluteUri,
            response.StatusCode,
            apiError.Message); // 假设你的ApiError有Message属性,换成你实际的字段
        
        // 可以选择抛出自定义异常,或者直接处理这个错误
        throw new CustomApiException(apiError);
    }
    
    // 请求成功的逻辑,解析返回结果
    var result = await response.Content.ReadAsAsync<YourExpectedResultType>();
    return result;
}
catch (HttpRequestException e)
{
    // 这里捕获的是真正的网络异常,比如连接超时、DNS解析失败这类
    this.logger.LogError(
        "请求{Uri}发生网络错误",
        requestUri.AbsoluteUri,
        LogCategoryRepository.ApiCashdesk,
        e);
    throw;
}

方法二:从HttpRequestException里直接取响应(如果必须用异常捕获)

如果你一定要通过捕获HttpRequestException来处理,在.NET 5及以上版本中,HttpRequestException新增了HttpResponse属性,你可以通过它拿到原始响应,再解析错误内容:

catch (HttpRequestException e)
{
    // 先判断是否有关联的响应对象(只有非网络类的错误才会有)
    if (e.HttpResponse != null)
    {
        // 解析发送端返回的ApiError
        var apiError = await e.HttpResponse.Content.ReadAsAsync<ApiError>();
        
        this.logger.LogError(
            "请求{Uri}出错:状态码{StatusCode},错误详情:{ErrorDetails}",
            requestUri.AbsoluteUri,
            e.HttpResponse.StatusCode,
            apiError);
    }
    else
    {
        // 处理纯网络异常的情况
        this.logger.LogError(
            "请求{0}发生网络错误",
            requestUri.AbsoluteUri,
            LogCategoryRepository.ApiCashdesk,
            e);
    }
    throw;
}

几个要注意的点

  • 发送端和接收端的ApiError类必须完全一致:属性名称、类型都要对应上,否则JSON反序列化会失败。
  • 不要把业务错误和网络异常混为一谈:比如参数错误、资源找不到这类业务逻辑错误,应该用响应状态码+自定义错误体返回;而连接超时、服务器不可达这类才是需要捕获HttpRequestException的网络异常。
  • 如果发送端用的是JsonMediaTypeFormatter,接收端用ReadAsAsync<T>时默认会用JSON解析,格式是匹配的,不用额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:54:47