.NET 8客户端调用MVC3 API传参为Null,.NET Framework4.8正常
问题分析与解决方案
问题描述
将基于.NET Framework 4.8的WinForm客户端升级至.NET 8后,调用本地MVC3 API提交Institution_Budget对象时,服务端接收的sourceinstitution_Budget参数为Null。客户端代码未修改,编译运行无报错,两端均使用Newtonsoft.Json 13.3版本。
核心原因
.NET 8中HttpClient.PutAsJsonAsync默认使用System.Text.Json进行序列化,而MVC3服务端依赖Newtonsoft.Json反序列化。两者默认配置存在差异(例如属性命名策略、序列化行为),导致服务端无法正确解析请求体,最终接收为Null。而.NET Framework 4.8中的PutAsJsonAsync原本就基于Newtonsoft.Json实现,因此可以正常工作。
解决方案
替换PutAsJsonAsync为手动使用Newtonsoft.Json序列化并发送请求,确保两端序列化逻辑一致:
修改客户端代码
public async Task<string> putBudgetasync(Institution_Budget ib) { HttpClientHandler handler = new HttpClientHandler(); handler.UseDefaultCredentials = true; using (var client = new HttpClient(handler)) { client.DefaultRequestHeaders.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); var myuri = new Uri(urlbase + "api/InstBudget/"); // 用Newtonsoft.Json手动序列化对象 var jsonContent = JsonConvert.SerializeObject(ib); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); // 发送PUT请求 HttpResponseMessage response = await client.PutAsync(myuri, content); if (response.IsSuccessStatusCode) { return "OK_putBudget"; } else { return "Error_putBudget"; } } }
额外排查点
- 检查
Institution_Budget类的属性是否符合序列化要求(例如有无无参构造函数、属性是否为公共可读写) - 可以通过抓包工具对比.NET Framework 4.8和.NET 8客户端发送的请求体,确认JSON格式差异
- 确保服务端MVC3的Json序列化配置未修改,保持默认的Newtonsoft.Json行为
内容的提问来源于stack exchange,提问作者Haim Katz
相关产品推荐
相关产品推荐

