.NET 8中使用HttpClient调试时程序无提示退出问题排查
.NET 8 HttpClient调用内部API异常退出问题
问题描述
首次在.NET 8中使用HttpClient调用公司内部API,Postman请求可正常返回结果,但代码调用后既无错误提示,也无法获取数据,程序直接退出,且不会进入try...catch块。
已做配置
已添加NuGet包:
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
Program.cs中的HttpClient配置:
var workbrainApiUrl = context.Configuration["WorkbrainApiURL"] ?? string.Empty; var workbrainClientId = context.Configuration["WorkbrainApi:Username"] ?? string.Empty; var workbrainTransactionId = context.Configuration["WorkbrainApi:Password"] ?? string.Empty; services.AddHttpClient("workbrainAPI", (serviceProvider, client) => { client.DefaultRequestHeaders.Add("Accept", "application/json"); client.Timeout = TimeSpan.FromSeconds(30); client.DefaultRequestHeaders.Add("X-Client-ID", workbrainClientId); client.DefaultRequestHeaders.Add("X-Transaction-ID", workbrainTransactionId); client.BaseAddress = new Uri(workbrainApiUrl); });
调用代码
调试时可追踪到GetFromJsonAsync步骤,API地址和ClientID均正确填充,但之后程序直接退出,无错误也不执行后续逻辑:
try { var apiEndPoint = $"service/clock/getGroupInfo?lastUpdateDate=10-02-2024" var client = _factory.CreateClient("workbrainAPI"); var response = await client.GetFromJsonAsync<ReaderGroupResponse>(apiEndPoint); } catch (Exception ex) { await _log.LogError($"Error {ex.Message}"); throw; }
API响应示例(Postman返回)
{ "date": "Mon Nov 04 08:57:27 CST 2024", "result": [ { "readerGroupId": 12474, "readerGroupName": "Southwest Group", "readerGroupDescription": "Used for the Southwest group", "readerGroupType": "CLOCK SERVER", "readerGroupStatus": null, "lastUpdateUTC": "2024-10-03 19:56:55" } ], "message": "Successfully Returned reader Groups.", "isSuccess": "true", "statusCode": "200 OK" }
实体类定义
public class ReaderGroupResponse { public string date { get; set; } = string.Empty; public List<ReaderGroup> result { get; set; } = new List<ReaderGroup>(); public string message { get; set; } = string.Empty; public bool isSuccess { get; set; } = false; public string statusCode { get; set; } = string.Empty; } public class ReaderGroup { public int ReaderGroupId { get; set; } public string ReaderGroupName { get; set; } = string.Empty; public string ReaderGroupDescription { get; set; } = string.Empty; public string ReaderGroupType { get; set; } = string.Empty; public string LastUpdateUTC { get; set; } = string.Empty; }
解决方案
1. 修复异步代码未等待问题
程序直接退出核心原因是异步方法未被正确等待,导致主线程提前终止。
- 如果调用这段API逻辑的方法是异步的,必须确保调用时使用
await:// 正确示例:等待异步方法执行完成 await YourApiCallMethod(); - 若是控制台程序,需将
Main方法改为异步入口:public static async Task Main(string[] args) { var host = Host.CreateDefaultBuilder(args).Build(); await host.RunAsync(); }
2. 修正实体类序列化不匹配问题
API返回的字段和实体类存在两处不匹配,会导致序列化失败(GetFromJsonAsync默认不抛出异常,仅返回null):
isSuccess字段:API返回字符串类型"true",实体类定义为bool,需调整为字符串或添加序列化转换器:// 方式1:改为字符串类型 public string isSuccess { get; set; } = "false"; // 方式2:用属性配置自动转换 using System.Text.Json.Serialization; [JsonPropertyName("isSuccess")] [JsonConverter(typeof(JsonStringEnumConverter))] public bool isSuccess { get; set; } = false;- 属性大小写不匹配:API返回小驼峰(如
readerGroupId),实体类用大驼峰,可开启忽略大小写配置或添加JsonPropertyName:public class ReaderGroup { [JsonPropertyName("readerGroupId")] public int ReaderGroupId { get; set; } [JsonPropertyName("readerGroupName")] public string ReaderGroupName { get; set; } = string.Empty; // 其他字段同理添加JsonPropertyName } // 或在反序列化时开启忽略大小写 var response = JsonSerializer.Deserialize<ReaderGroupResponse>(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
3. 改用GetAsync排查响应状态
暂时替换GetFromJsonAsync为GetAsync,手动处理响应,强制检查HTTP状态码,避免隐藏错误:
try { var apiEndPoint = $"service/clock/getGroupInfo?lastUpdateDate=10-02-2024"; var client = _factory.CreateClient("workbrainAPI"); var httpResponse = await client.GetAsync(apiEndPoint); // 非2xx状态码直接抛出异常 httpResponse.EnsureSuccessStatusCode(); var responseContent = await httpResponse.Content.ReadAsStringAsync(); var response = JsonSerializer.Deserialize<ReaderGroupResponse>(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch (Exception ex) { await _log.LogError($"Error: {ex.Message}\nStackTrace: {ex.StackTrace}"); throw; }
4. 检查BaseAddress格式
确保WorkbrainApiURL配置的地址末尾包含/,比如API地址为http://example.com/api,BaseAddress需设为http://example.com/api/,否则拼接接口路径时会出现地址错误。
内容的提问来源于stack exchange,提问作者Caverman
相关产品推荐
相关产品推荐

