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

C#创建REST客户端遇异常:.NET Core 3.1控制台程序无响应退出

C# .NET Core 3.1 REST客户端问题排查与修复

你的代码存在几个关键问题,导致程序直接退出或无法正确获取数据,以下是具体问题和修复方案:


核心问题分析

  • Main方法未等待异步操作:原Main是void类型,调用RunAsync()后未等待异步任务完成,程序直接终止。
  • 方法调用参数错误:RunAsync中调用ShowcaseNumber时传入了不存在的变量numberModel,实际应传入number。
  • API请求格式不匹配:numbersapi.com默认返回纯文本,而非JSON格式,导致ReadAsAsync<NumberModel>无法解析数据。
  • Model属性与JSON字段不匹配:numbersapi返回的JSON字段为小写text和number,默认序列化器大小写敏感,无法映射到你的Model属性。

修正后的代码

Program.cs

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using NumbersConsole.Models;

namespace NumbersConsole
{
    class Program
    {
        static HttpClient client = new HttpClient();

        static void ShowcaseNumber(NumberModel numberModel)
        {
            if (numberModel == null)
            {
                Console.WriteLine("未能获取数据");
                Console.ReadLine();
                return;
            }
            Console.WriteLine($"Number: {numberModel.Number}");
            Console.WriteLine($"Fact: {numberModel.Text}");
            Console.ReadLine();
        }

        static async Task<NumberModel> GetNumberModelAsync()
        {
            // 添加/json后缀,获取JSON格式响应
            var path = new Uri("http://numbersapi.com/41/json");
            HttpResponseMessage response = await client.GetAsync(path);
            
            if (response.IsSuccessStatusCode)
            {
                // .NET Core 3.1推荐使用ReadFromJsonAsync替代ReadAsAsync
                return await response.Content.ReadFromJsonAsync<NumberModel>();
            }
            
            Console.WriteLine($"请求失败,状态码:{response.StatusCode}");
            return null;
        }

        // 改为异步Main方法,等待异步任务完成
        static async Task Main(string[] args)
        {
            await RunAsync();
        }

        static async Task RunAsync()
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            
            NumberModel number = await GetNumberModelAsync();
            ShowcaseNumber(number); // 修正参数名
        }
    }
}

NumberModel.cs

using System.Text.Json.Serialization;

namespace NumbersConsole.Models
{
    public class NumberModel
    {
        // 映射JSON的text字段
        [JsonPropertyName("text")]
        public string Text { get; set; }
        
        // 映射JSON的number字段
        [JsonPropertyName("number")]
        public int Number { get; set; }
    }
}

关键修复说明

  1. 异步Main方法:将Main改为async Task Main并await RunAsync(),确保程序等待所有异步操作完成后再退出。
  2. API URL调整:添加/json后缀,让numbersapi返回可解析的JSON数据。
  3. 字段映射:使用[JsonPropertyName]特性解决JSON字段与C#属性的大小写不匹配问题。
  4. 错误处理增强:增加null判断和错误状态码打印,避免空引用异常并便于排查问题。
  5. 序列化方法替换:使用.NET Core 3.1内置的ReadFromJsonAsync,无需额外安装格式化包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:27:26