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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:27:38