我在问是否有人知道是否可以将继承自抽象类的具体类传递给Web Api。
例如:
public abstract class A
{
A();
}
public class B : A
{
}
[POST("api/Request/{a}")]
public class Request(A a)
{
}
目前,我环顾四周,大多数解决方案似乎都说使用TypeNameHandling是可行的。JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();
jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
但是,事实并非如此。我的模型也从控制台应用程序传递到webapi。我已经读到我可以反序列化json对象,并且尝试了几次之后,我认为这是行不通的。我已经考虑过创建一个客户模型联编程序,但是,我不想使我的应用程序变得更复杂。目前,我从具有3个模型的抽象类继承,但将来可能会对此进行扩展。您可能会注意到,添加自定义模型联编程序可能需要多个联编程序,除非有一种方法可以使所有类型的抽象类通用一个联编程序。
为了在我的控制台应用程序中对此进行扩展,我已经实例化了类b,然后在将其发布到我的webapi之前将其传递给ObjectContent。
item = B();
//serialize and post to web api
MediaTypeFormatter formatter;
JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();
jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
formatter = jsonFormatter;
_content = new ObjectContent<A>(item, formatter);
var response = _client.PostAsync("api/Request", _content).Result;
当调用webapi操作时,该对象为null 最佳答案
如果真的想实现问题中的要求,则可以使用一种自定义的方式来实现。
首先,创建一个从JsonConverter
继承的自定义json转换器,在其中选择目标类并反序列化实例。
然后,在WebApiConfig.Register
中,将新的转换器添加到config.Formatters.JsonFormatter.SerializerSettings.Converters
中,并享受这种怪异的作用。
你应该做吗?不。
了解如何使用这样的API不会给任何新用户带来快乐,记录下来并不容易,而且最重要的是-以这种方式实现它没有任何好处。如果输入类型不同,则应使用具有不同URL的单独API方法。如果只有几个不同的属性-将它们设为可选。
为什么这个例子不起作用?
TypeNameHandling来自Json.NET,Web API对此一无所知,并且类型信息也不是JSON规范的一部分,因此没有解决此特定问题的标准方法。
关于c# - Web Api模型绑定(bind)和多态继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17277578/