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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:03:26