2

我有一个现有的控制器,[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参数?

4

1 回答 1

1

这是我在我的 WebAPI 中所做的事情。我有一个包含许多 Player 实体的 Team 实体。每个 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();
            }

        }
于 2017-06-30T15:46:57.423 回答