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

ASP.NET Web API 2中[FromBody]接收值为null的问题排查

解决WebAPI中[FromBody]接收string参数为null的问题

问题原因

你当前的WebAPI方法用[FromBody] string value接收参数,但客户端发送的是完整的JSON对象(比如{"DeviceId":"apples","ccId":1}),而WebAPI对[FromBody] string的默认绑定规则是:期望请求体是一个带双引号的原始字符串(比如"{\"DeviceId\":\"apples\",\"ccId\":1}"),直接发送JSON对象会导致绑定失败,value为null。

解决方案

方案一:直接接收强类型对象(推荐)

把API方法的参数改成TagCall类型,WebAPI会自动完成JSON反序列化,无需手动处理:

// POST api/<controller>
public IHttpActionResult Post([FromBody] Model.TagCall tagCall)
{
    if (tagCall == null)
    {
        return BadRequest("请求数据无效");
    }
    new CampaignContactService().UpdateCallStatusToPulled(tagCall.DeviceId, tagCall.ccId);

    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent("success", Encoding.UTF8, "application/json");

    return ResponseMessage(response);
}

客户端代码无需修改,保持当前发送JSON对象的方式即可,参数能正常绑定。

方案二:坚持接收string类型(不推荐)

如果一定要用string接收,需要修改客户端发送的内容,把序列化后的JSON字符串再包裹一层双引号,同时保留application/json的Content-Type:

static async Task ReadAsStringAsync(string url, string jsonBody)
{
    // 把JSON字符串包裹双引号并转义内部引号
    var wrappedJson = $"\"{jsonBody.Replace("\"", "\\\"")}\"";
    var data = new StringContent(wrappedJson, Encoding.UTF8, "application/json");

    using (var c = new HttpClient())
    {
        try
        {
            var response = await c.PostAsync(url, data);
            Result = await response.Content.ReadAsStringAsync();
            Console.WriteLine(Result);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}

这样WebAPI就能正确识别请求体为字符串类型,value参数会被赋值为序列化后的JSON字符串,之后可正常反序列化。

内容的提问来源于stack exchange,提问作者JL1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 03:52:39