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

如何从HttpClient.GetAsync抛出的异常中获取HttpRequestMessage对象

实现方案

原有调用方式中GetAsync(requestUri)会在方法内部自动创建HttpRequestMessage实例,该实例如果在请求完成前触发异常,不会对外暴露,所以无法直接从异常或者上下文里拿到。

最稳妥、兼容所有.NET版本的实现方式是主动提前构造HttpRequestMessage实例持有引用,改用SendAsync方法发送请求,请求对象的作用域覆盖try和catch块即可,示例代码如下:

// 提前构造GET请求实例,作用域覆盖后续try、catch块
using var requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUri);
// 可在此处提前配置请求头
// requestMessage.Headers.TryAddWithoutValidation("CustomHeader", "value");

try {
    using var responseMsg = await httpClient.SendAsync(requestMessage);
    // 原有正常响应处理逻辑
    var requestMessageFromResponse = responseMsg.RequestMessage;
} catch (Exception ex) {
    // 直接使用提前构造的请求对象即可
    Log(requestMessage.Headers);
}

备选方案(不推荐)

如果不想调整原有调用逻辑,.NET 5及更高版本中抛出的HttpRequestException会自带HttpRequestMessage属性,可以尝试通过以下方式获取,但该方式兼容性差,且非请求类异常不会携带该属性,存在拿不到的风险:

try {
  using var responseMsg = await httpClient.GetAsync(requestUri);
  var requestMessage = responseMsg.RequestMessage;
} catch (Exception ex) {
  var requestMessage = (ex as HttpRequestException)?.HttpRequestMessage;
  if (requestMessage != null) 
  {
      Log(requestMessage.Headers);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:54:04