Post请求后WebService控制器接收空Model问题求助
WebService API接收Post请求时Model为空的排查方向
问题情况
开发的WebService应用中,某API接收Post请求后,服务端控制器获取到的Model为空。调试确认客户端发送的Model已正确赋值,且同一客户端调用其他API无此问题。
客户端调用代码
private async void AddDriverPayment() { ModelPalmDriverPaymentRequest modelPalmDriverPaymentRequest = new ModelPalmDriverPaymentRequest() { SCS_ID = int.Parse(gttDXTextEditAddDriverPaymentSCS_ID.Text), DriverID = int.Parse(gttDXTextEditAddDriverPaymentDriverID.Text), Amount = decimal.Parse(gttDXTextEditAddDriverPaymentAmount.Text), Remark = gttDXTextEditAddDriverPaymentRemark.Text, PaymentType = gttDXTextEditAddDriverPaymentPaymentType.Text, PaymentYear = int.Parse(gttDXTextEditAddDriverPaymentPaymentYear.Text), PaymentWeek = int.Parse(gttDXTextEditAddDriverPaymentPaymentWeek.Text), DocumentPath = gttDXTextEditAddDriverPaymentDocumentPath.Text, DatePayment = dateTimePickerAddDriverPayment.Value }; string JsonData = JsonConvert.SerializeObject(modelPalmDriverPaymentRequest); System.Net.Http.StringContent restContent = new StringContent(JsonData, Encoding.UTF8, "application/json"); HttpClient client = new HttpClient(); try { var response = await client.PostAsync(comboBoxEditPalmAddDriverPayment.Text, restContent); if (response.IsSuccessStatusCode) { var stream = await response.Content.ReadAsStringAsync(); ModelPalmDriverPaymentResponse Result = JsonConvert.DeserializeObject<ModelPalmDriverPaymentResponse>(stream); textBoxAddDriverPaymentResult.Text = Result.SCS_ID.ToString() + " " + Result.PaymentID.ToString(); } else { textBoxAddDriverPaymentResult.Text = response.StatusCode + " " + response.ReasonPhrase; } } catch (Exception ex) { textBoxAddDriverPaymentResult.Text = ex.Message; } }
服务端控制器代码
[Route("palm/AddDriverPayment")] [ApiController] public class ControllerPalmDriverPayment : ControllerBase { private readonly RepositoryPalmDriverPayment _repositoryPalmDriverPayment = new(); [HttpPost] public IActionResult AddDriverPayment(ModelPalmDriverPaymentRequest modelPalmDriverPaymentRequest) { try { return base.Ok(_repositoryPalmDriverPayment.AddDriverPaymemnt(modelPalmDriverPaymentRequest)); } catch (System.Exception) { return base.BadRequest("Nope not working..."); } } }
Model定义(客户端与服务端完全一致)
public class ModelPalmDriverPaymentRequest { public int SCS_ID; public int DriverID; public decimal Amount; public string? Remark; public string? PaymentType; public int PaymentYear; public int PaymentWeek; public string? DocumentPath; public DateTime DatePayment; }
排查方向建议
- 将Model的字段改为属性:ASP.NET Core的模型绑定默认只处理带
get/set的属性,而非字段。当前Model使用的是公共字段,服务端无法完成绑定。修改示例:public class ModelPalmDriverPaymentRequest { public int SCS_ID { get; set; } public int DriverID { get; set; } public decimal Amount { get; set; } public string? Remark { get; set; } public string? PaymentType { get; set; } public int PaymentYear { get; set; } public int PaymentWeek { get; set; } public string? DocumentPath { get; set; } public DateTime DatePayment { get; set; } } - 明确指定[FromBody]特性:虽然
[ApiController]会默认从请求体绑定复杂类型,但显式添加[FromBody]可以避免潜在的绑定来源歧义。修改控制器方法参数:public IActionResult AddDriverPayment([FromBody] ModelPalmDriverPaymentRequest modelPalmDriverPaymentRequest) - 检查序列化配置匹配:客户端使用Newtonsoft.Json(JsonConvert),服务端默认使用System.Text.Json,两者的序列化规则可能存在差异(比如字段大小写、null值处理)。可以统一序列化库,或调整配置确保字段名匹配。
- 抓包验证请求内容:使用Fiddler、Postman等工具抓取请求,确认请求头的
Content-Type为application/json,且请求体的JSON内容与客户端构造的数据一致。 - 检查Model的可访问性与构造函数:确保Model类是公共的,且有无参构造函数(当前代码默认存在无参构造,但如果手动添加了带参构造函数,需要显式声明无参构造)。
内容的提问来源于stack exchange,提问作者GuidoG
相关产品推荐
相关产品推荐

