.NET Core 3.1 Web API生产环境Post参数始终为Null问题
问题排查与解决思路
1. JSON序列化库不一致导致反序列化失败
客户端使用Newtonsoft.Json(JsonConvert.SerializeObject)序列化对象,而.NET Core/.NET 5+的Web API默认使用System.Text.Json反序列化。两者对byte[]类型的序列化行为存在差异,若服务端未配置兼容Newtonsoft.Json的规则,会导致请求体无法正确解析。
解决方法:
- 服务端安装
Microsoft.AspNetCore.Mvc.NewtonsoftJsonNuGet包,在Program.cs(或Startup.cs)中配置使用Newtonsoft.Json:
// .NET 6+ Program.cs builder.Services.AddControllers().AddNewtonsoftJson(); // .NET Core 3.x Startup.cs services.AddControllers().AddNewtonsoftJson();
- 或客户端改用
System.Text.Json序列化,保持与服务端一致:
var encodedJson = JsonSerializer.Serialize(obj); var content = new StringContent(encodedJson, Encoding.UTF8, "application/json");
2. 生产环境路由匹配异常
控制器[Route("")]与Action[Route("api/upload")]组合后,实际路由应为/api/upload,但生产环境的反向代理(如IIS、Nginx)可能存在路由重写规则,导致请求未正确映射到目标Action,进而使[FromBody]参数无法绑定。
解决方法:
- 检查反向代理的路由配置,确保
https://my-app.com/api/upload能正确转发到Web API对应路由。 - 简化路由配置,避免冲突:
[Route("api")] public class AppController : ControllerBase { [HttpPost] [Route("upload")] public async Task<IActionResult> UploadDocumentsAsync([FromBody] Request request) { // ... } }
3. 请求大小超出生产环境限制
生产环境Web API默认限制了请求体大小,当上传的文件(Buffer)较大时,请求会被截断,导致反序列化失败,参数变为null。
解决方法:
- 在Web API中配置更大的请求大小限制,示例:
// Program.cs中配置全局限制 builder.Services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(options => { options.MultipartBodyLengthLimit = 104857600; // 100MB,按需调整 }); // 控制器Action上添加特性 [HttpPost] [Route("api/upload")] [RequestSizeLimit(104857600)] public async Task<IActionResult> UploadDocumentsAsync([FromBody] Request request) { // ... }
4. 请求头或编码问题
虽客户端设置了application/json的ContentType,但生产环境中间件可能修改了请求头,或StringContent的编码未被正确识别。
解决方法:
- 显式设置请求头的
Content-Type,确保服务端正确识别:
var content = new StringContent(encodedJson, Encoding.UTF8, "application/json"); content.Headers.ContentType = new MediaTypeHeaderValue("application/json") { CharSet = Encoding.UTF8.WebName };
5. 模型绑定验证失败
生产环境可能启用了严格的模型验证规则,当请求体JSON结构与模型不完全匹配时,会导致参数绑定失败。
解决方法:
- 在Web API中添加日志,输出请求体内容,检查是否与预期一致:
using (var reader = new StreamReader(Request.Body)) { var requestBody = await reader.ReadToEndAsync(); // 记录requestBody到日志,排查序列化是否正确 }
- 确保模型属性名称与JSON键完全匹配(注意大小写:System.Text.Json默认区分大小写,Newtonsoft.Json默认不区分)。
内容的提问来源于stack exchange,提问作者Bloggrammer
相关产品推荐
相关产品推荐

