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
相关产品推荐
相关产品推荐

