You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:20:31