WebAPI POST [FromBody]没有绑定而没有抛出错误

时间:2017-11-28 18:50:48

标签: c# json asp.net-web-api

我试图理解为什么我的JSON对象在转换为特定对象时,当我发送的一个属性(我的json,这是一个数字)大于Int32时给我NULL。我的整个对象没有绑定,也没有抛出任何错误,只是变成了空。

现在我的情况。我开始了一个新项目只是为了理解它,我在这里可以找到所有问题。

我确实有这个模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TestJson.Models
{
    public class Credential
    {
        public int IdSource { get; set; }
        public DateTime TransactionDate { get; set; }
    }
}

我有这个控制器:

using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using TestJson.Models;

namespace TestJson.Controllers
{
    [RoutePrefix("PreAuth")]
    public class PreAuthController : ApiController
    {
        [HttpPost]
        [ActionName("PostObject")]
        public async Task<IHttpActionResult> PostObject([FromBody]Credential input)
        {
            return await Task.FromResult(Ok(input));
        }

        [HttpPost]
        [ActionName("PostJObject")]
        public async Task<IHttpActionResult> PostJObject([FromBody]JObject input)
        {
            Credential Credential = input.ToObject<Credential>();

            return await Task.FromResult(Ok(Credential));
        }
    }
}

我有这个JSON对象:

{
    "IdSource": 11111111111111,
    "TransactionDate": "2017-11-24T11:59:01.7567643-02:00"
}

所以,当我在上面的JSON中调用api/PreAuth/PostObject时,我只是将null作为参数传递给我的对象。

但如果我调用相同的JSON /api/PreAuth/PostJObject,我可以收到以下给定的错误:

{
    "Message": "An error has occurred.",
    "ExceptionMessage": "Value was either too large or too small for an Int32.",
    "ExceptionType": "System.OverflowException",
    "StackTrace": "   em System.Convert.ToInt32(Int64 value)..."
}

所以,如果我将我的JSON对象修改为更短的数字,我的两个方法都可以正常工作,因为它可以适应int限制。

我的意思是;为什么当我调用方法IdSource期望参数中的指定对象并且它无法正确地将我的JSON投射到它时它会给我null而不填充我的其他属性?

最好的情况是至少会看到一些错误,但我什么都没得到。我的所有物体都被吞噬了,它就像一个隐形错误而且打电话者并不确切地知道他错误地指出了哪个属性。

如何使用object作为参数而不是JObject来解决这个问题?

1 个答案:

答案 0 :(得分:0)

您应该在HttpConfiguration(应用程序启动)上配置JsonFormatter。

一个例子:

req.body.forEach(function(itm1){
    proudcts.forEach(function(itm){

      // if ((itm1.judul === itm.judul) === null || undefined){

      //       fs.writeFile('cek.json', JSON.stringify(req.body));  
      // }else{

      //       fs.writeFile('cek1.json', JSON.stringify(req.body));  

      // }
      if (!(itm1.judul === itm.judul)){

            fs.writeFile('cek.json', JSON.stringify(req.body));  
      }else{

            fs.writeFile('cek1.json', JSON.stringify(req.body));  

      }

    })
  })

修改

上一个答案适用于扩展对象(我认为你的上面有空值)。

但是,您可以添加自定义过滤器,用于过滤有效模型,如下所述:

Capture exception during request deserialization in WebAPI C#