WebApi [FromBody] 解析

WebApi [FromBody] parsing

我有一个现有控制器,其中 [FromBody]HttpPost 方法中按预期工作。在编写测试时,我发现有必要使用客户序列化程序,以避免由于父对象具有引用父对象的子对象而导致的循环引用。序列化器使用这些设置:

JsonSerializerSettings Settings = new JsonSerializerSettings()
        {
            TypeNameHandling = TypeNameHandling.Auto,
            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
            PreserveReferencesHandling = PreserveReferencesHandling.Objects,
            ObjectCreationHandling = ObjectCreationHandling.Auto
        };

问题是 [FromBody] 无法解析该序列化程序生成的对象(它抛出 Newtonsoft.Json.JsonSerializationException)。但是,如果我将 [FromBody] 更改为动态的,例如

public IActionResult Update([FromBody]dynamic json)
{
   var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MyType>(json);
   ...
}

然后我就可以毫无问题地解析对象了。这让我很困惑,我想知道我是否可以覆盖 WebApi 为 [FromBody] 所做的事情,这样我就可以获得正确的对象,而不必让每个方法都接受一个 dynamic 参数?

这是我在 WebAPI 中所做的事情。我有一个 Team 实体,其中有许多 Player 实体。每个 Player 实体都有对 Team 实体的引用。当我检索一个玩家时,它将有一个团队,而团队将拥有所有玩家,每个玩家将再次拥有一个团队。

为了处理这个问题,我不得不改变公开数据和使用数据的方法。我为每个实体创建了模型并公开了模型对象。模型对象是平面对象。对于 Player 模型,它具有 TeamID 和 Team Name 而不是使用整个 Team 对象。

我使用模型工厂从实体中创建模型,并从模型中创建实体。在 WebAPI 控制器中,使用了类似下面的东西

        [ModelValidator]
        public IHttpActionResult Post([FromBody] DoctorModel doctorModel)
        {
            try
            {
                var doctorEntity = ModelFactory.Create(doctorModel);
                doctorEntity.UserId = Userid;
                var doctor = UnitOfWork.Doctors.Add(doctorEntity);
                var doctorModelNew = ModelFactory.Create(doctor);
                return Ok(doctorModelNew);
            }
            catch (Exception ex)
            {
                //Logging    
#if DEBUG
                return InternalServerError(ex);
#endif
                return InternalServerError();
            }

        }