如何让返回泛型反序列化结果的方法同时返回HttpStatusCode
解决方案
GetFromJsonAsync是HttpClient的快捷封装方法,它直接返回反序列化后的泛型对象,不会暴露底层的HttpResponseMessage,所以没法直接获取状态码。要同时拿到泛型结果和状态码,需要先手动发送请求获取完整响应对象,再做后续处理:
改写后的代码如下:
public async Task<(T? Result, HttpStatusCode StatusCode)> Get<T>(string clientName, string resource, CancellationToken cancellationToken) { var client = ConfigureHttpClient(clientName); // 先获取完整的响应对象 var response = await client.GetAsync(resource, cancellationToken); // 可选:如果需要在非成功状态码时抛出异常,保留这行;不需要则注释掉 // response.EnsureSuccessStatusCode(); T? result = default; // 仅在响应有内容时进行反序列化 if (response.Content is not null) { result = await response.Content.ReadFromJsonAsync<T>(cancellationToken: cancellationToken); } return (result, response.StatusCode); } private HttpClient ConfigureHttpClient(string clientName) { var client = _clientFactory.CreateClient(clientName); client.Timeout = TimeSpan.FromSeconds(Convert.ToDouble(_configuration["HttpClientSettings:Timeout"])); return client; }
关键说明:
- 用
GetAsync替代GetFromJsonAsync,先拿到HttpResponseMessage,从中直接读取StatusCode - 通过
response.Content.ReadFromJsonAsync<T>完成泛型对象的反序列化 - 元组返回值明确标注
Result和StatusCode的名称,提升代码可读性 - 增加响应内容为空的判断,避免空引用异常
- 保留原有
ConfigureHttpClient方法,不破坏原有配置逻辑
内容的提问来源于stack exchange,提问作者शेखर
相关产品推荐
相关产品推荐

