C#中如何获取与属性类不匹配的HTTP POST请求体?
解决Web API接收POST JSON时的空引用与数据匹配问题
一、先定位空引用的核心原因
空引用异常通常是JSON与模型类不匹配导致模型绑定失败,最终传入Action的模型对象为null,后续操作时触发异常。先从基础匹配规则排查:
- 确保模型类的属性名称与JSON键名完全匹配(默认大小写敏感),比如JSON里是
"userName",模型类不能写成UserName; - 模型类属性必须是public权限且包含
get/set方法,示例:
public class RequestModel { public string UserName { get; set; } public int? Age { get; set; } // 可选字段用可空类型 }
- 嵌套类型需保持结构一致,嵌套类同样满足上述访问权限要求。
二、绕过模型绑定,直接读取原始JSON
如果模型绑定始终失败,可以直接读取请求的原始JSON内容,手动解析:
ASP.NET Core 版本
[HttpPost] public async Task<IActionResult> ReceiveData() { using var streamReader = new StreamReader(Request.Body); string rawJson = await streamReader.ReadToEndAsync(); // 用System.Text.Json手动解析 var model = JsonSerializer.Deserialize<RequestModel>(rawJson); // 后续业务逻辑 return Ok(model); }
老版ASP.NET Web API 版本
public async Task<IHttpActionResult> ReceiveData() { string rawJson = await Request.Content.ReadAsStringAsync(); var model = Newtonsoft.Json.JsonConvert.DeserializeObject<RequestModel>(rawJson); return Ok(model); }
三、调试模型绑定失败细节
在Action中添加模型状态验证,直接输出绑定错误:
[HttpPost] public IActionResult ReceiveData(RequestModel model) { if (!ModelState.IsValid) { var errorMessages = ModelState .SelectMany(x => x.Value.Errors) .Select(e => e.ErrorMessage); return BadRequest(errorMessages); } // 后续逻辑 }
同时检查请求的Content-Type是否为application/json,非JSON类型的请求会直接导致模型绑定失败。
四、配置全局JSON序列化规则(ASP.NET Core)
如果JSON与模型存在驼峰/大驼峰命名差异,可全局配置序列化选项,自动适配:
// Program.cs 中添加 builder.Services.AddControllers() .AddJsonOptions(options => { // 允许属性名称不区分大小写匹配 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 自动将模型PascalCase属性映射到JSON驼峰键名 options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; });
内容的提问来源于stack exchange,提问作者Sapnandu
相关产品推荐
相关产品推荐

