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

GetProductsAsync方法API响应异常:项目等待响应时冻结

问题排查:调用GetProductsAsync时程序冻结无响应

核心现象

  • GetUsersAsync能正常请求外部API并返回数据,但GetProductsAsync请求本地https://localhost:7024/api/Product时,程序卡在await _httpClient.GetAsync(...)步骤,后续代码完全无法执行
  • 本地API的响应格式符合预期,JSON结构与ApiResponse类匹配

排查与解决方案

1. 先确认本地API服务状态

  • 直接用浏览器/Postman请求https://localhost:7024/api/Product,验证是否能快速返回响应:
    • 如果浏览器也卡住,说明问题出在本地API服务本身(比如代码死循环、同步阻塞操作、服务未正确启动),检查API端的日志或断点调试
    • 如果浏览器能正常返回,再排查客户端侧的问题

2. 检查异步调用是否存在死锁

这是最常见的冻结原因:如果调用GetProductsAsync时用了同步阻塞方法(.Result/.Wait()),会导致异步上下文死锁。

  • 错误示例:
    // 禁止这种写法,会引发死锁
    var products = userService.GetProductsAsync().Result;
    
  • 修正:全程使用await调用异步方法,保持异步上下文一致:
    var products = await userService.GetProductsAsync();
    

3. 本地HTTPS证书验证问题

本地API使用HTTPS,若客户端不信任自签名证书,HttpClient可能无限等待而不抛出异常:

  • 开发环境临时解决方案(仅限测试用):
    // 在HttpClient初始化时添加证书验证回调
    var handler = new HttpClientHandler();
    handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
    var httpClient = new HttpClient(handler);
    
  • 长期解决方案:将本地API的自签名证书导入系统信任根证书库

4. 配置请求超时快速定位

默认HttpClient超时为100秒,设置更短超时可以快速确认是请求未响应还是处理缓慢:

// 在UserService构造函数中配置
_httpClient.Timeout = TimeSpan.FromSeconds(10);

如果超时后抛出异常,说明请求确实未被本地API及时响应,重点排查API端的处理逻辑

5. 完善JSON序列化配置

虽然不会导致请求阶段卡住,但API返回的是小写属性名(data/errors),而类属性是大写开头(Data/Errors),需要配置忽略大小写避免映射失败:

public async Task<ApiResponse> GetProductsAsync()
{
    var response = await _httpClient.GetAsync("https://localhost:7024/api/Product");
    response.EnsureSuccessStatusCode(); 
    var content = await response.Content.ReadAsStringAsync();
    // 添加大小写忽略配置
    return JsonSerializer.Deserialize<ApiResponse>(content, new JsonSerializerOptions
    {
        PropertyNameCaseInsensitive = true
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:29:55