如何从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
相关产品推荐
相关产品推荐

