.NET 8.0 API中带[FromBody] dynamic参数的POST方法调用异常问题
.NET 8 中 [FromBody] dynamic 参数前端调用无响应的解决方案
1. 校验请求内容类型与序列化格式
.NET 8 的 System.Text.Json 对请求格式的校验比 .NET 3.1 更严格,需确保前端请求明确指定 Content-Type: application/json,并正确序列化请求体:
- Axios 示例:
axios.post('/api/WeatherForecast', { key: 'testValue' }, { headers: { 'Content-Type': 'application/json' } }) - Fetch 示例:
fetch('/api/WeatherForecast', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: 'testValue' }) })
2. 替换 dynamic 为强类型模型(推荐方案)
.NET 8 中 System.Text.Json 对 dynamic 参数的反序列化逻辑已变更,不再默认转为 ExpandoObject,而是返回 JsonElement,导致参数绑定失败。改用强类型模型可彻底解决兼容性问题:
public class ForecastRequest { public string RequiredField { get; set; } // 根据实际需求添加字段 } [HttpPost] public IActionResult Post([FromBody] ForecastRequest request) { // 业务逻辑处理 return Ok(request); }
3. 配置 JSON 序列化兼容 dynamic 参数
若必须保留 dynamic 写法,可在 Program.cs 中修改 JSON 序列化配置,强制将动态参数反序列化为 ExpandoObject:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver { Modifiers = { typeInfo => { if (typeInfo.Type == typeof(dynamic)) { typeInfo.Kind = JsonTypeInfoKind.Object; typeInfo.CreateObject = () => new ExpandoObject(); } } } }; });
4. 排查跨域配置
确认 .NET 8 项目已正确配置跨域策略,避免前端请求被拦截:
builder.Services.AddCors(options => { options.AddPolicy("AllowFrontend", policy => { policy.WithOrigins("http://localhost:3000") // 替换为你的前端地址 .AllowAnyMethod() .AllowAnyHeader(); }); }); // 在路由配置后启用跨域 app.UseRouting(); app.UseCors("AllowFrontend"); app.UseAuthorization();
内容的提问来源于stack exchange,提问作者user27052002
相关产品推荐
相关产品推荐

