控制台APP调用Post接口时参数值全为0或null问题排查
问题:控制台调用Post接口时参数始终为默认值(0或null)
我在用控制台应用调用Post接口时遇到异常,传递的参数始终是默认值(0或null)。以下是相关代码:
控制台应用代码
using MSE.DTO.DTOs.WorkStation; using Newtonsoft.Json; using System.Text; var random = new Random(); var data = new WorkStationRandomValueDTO { WorkStationId = random.Next(1, 100), Temperature = (decimal)Math.Round(random.NextDouble() * 100, 2), Pressure = (decimal)Math.Round(random.NextDouble() * 2000, 2), Status = random.Next(0, 1) == 1 }; var json = JsonConvert.SerializeObject(data); var content = new StringContent(json, Encoding.UTF8, "application/json"); using (var client = new HttpClient()) { var response = client.PostAsync("http://localhost:5002/WorkStationRandom/Post", content).Result; if (response.IsSuccessStatusCode) { Console.WriteLine("Data saved successfully!"); } else { Console.WriteLine("Failed to save data: " + response.StatusCode); } }
Mvc Api控制器代码
using AutoMapper; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using MSE.DataAccess.Context; using MSE.DTO.DTOs.WorkStation; using MSE.Entity.Entities.Concrete; using System.Net; using System.Text.Json.Serialization; using System.Web.Http; using FromBodyAttribute = System.Web.Http.FromBodyAttribute; using HttpGetAttribute = System.Web.Http.HttpGetAttribute; using HttpPostAttribute = System.Web.Http.HttpPostAttribute; using RouteAttribute = System.Web.Http.RouteAttribute; namespace MSE.Web.Controllers { public class WorkStationRandomController : ApiController { private readonly ApplicationDbContext _dbContext; private readonly IMapper _mapper; public WorkStationRandomController(ApplicationDbContext dbContext, IMapper mapper) { _dbContext = dbContext; _mapper = mapper; } [HttpPost] public IHttpActionResult Post(WorkStationRandomValueDTO data) { if (data != null) { var workStation = _mapper.Map<WorkStation>(data); _dbContext.WorkStations.Add(workStation); _dbContext.SaveChanges(); return Ok(); } else { return BadRequest("Data cannot be null."); } } [System.Web.Http.HttpGet] public string Get() { return "ok"; } } }
问题原因及解决办法
- 核心问题:控制器混用了ASP.NET Web API(
System.Web.Http)与ASP.NET Core的特性,且Post方法参数未标记[FromBody],导致框架无法正确解析请求体中的JSON数据。 - 修正步骤:
- 移除
System.Web.Http相关引用:ASP.NET Core项目应使用Microsoft.AspNetCore.Mvc下的特性,无需引用旧版Web API的命名空间。 - 给Post参数添加
[FromBody]:明确指定参数从请求体中解析。 - 统一使用ASP.NET Core特性:继承
ControllerBase而非旧版ApiController,使用[ApiController]和[Route]规范路由。 - 修正控制台请求地址:路由定义为
[Route("[controller]")]后,请求地址应改为http://localhost:5002/WorkStationRandom,无需追加/Post。
- 移除
修正后的控制器代码:
using AutoMapper; using Microsoft.AspNetCore.Mvc; using MSE.DataAccess.Context; using MSE.DTO.DTOs.WorkStation; using MSE.Entity.Entities.Concrete; namespace MSE.Web.Controllers { [ApiController] [Route("[controller]")] public class WorkStationRandomController : ControllerBase { private readonly ApplicationDbContext _dbContext; private readonly IMapper _mapper; public WorkStationRandomController(ApplicationDbContext dbContext, IMapper mapper) { _dbContext = dbContext; _mapper = mapper; } [HttpPost] public IActionResult Post([FromBody] WorkStationRandomValueDTO data) { if (data != null) { var workStation = _mapper.Map<WorkStation>(data); _dbContext.WorkStations.Add(workStation); _dbContext.SaveChanges(); return Ok(); } else { return BadRequest("Data cannot be null."); } } [HttpGet] public string Get() { return "ok"; } } }
内容的提问来源于stack exchange,提问作者yigit_tanyel
相关产品推荐
相关产品推荐

