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; } } }
关键修复说明
- 异步Main方法:将Main改为
async Task Main并await RunAsync(),确保程序等待所有异步操作完成后再退出。 - API URL调整:添加
/json后缀,让numbersapi返回可解析的JSON数据。 - 字段映射:使用
[JsonPropertyName]特性解决JSON字段与C#属性的大小写不匹配问题。 - 错误处理增强:增加null判断和错误状态码打印,避免空引用异常并便于排查问题。
- 序列化方法替换:使用.NET Core 3.1内置的
ReadFromJsonAsync,无需额外安装格式化包。
内容的提问来源于stack exchange,提问作者Robbebeest
相关产品推荐
相关产品推荐

