我有一个控制器操作,它将JSON文档作为POST请求的主体。我希望通过模型绑定自动创建JObject
,如下所示:
[HttpPost]
public ActionResult Index([FromBody] JObject data)
{
// "data" is now a populated JObject object
}
但是我没有创建一个抽象类的错误。我试图从JObject
扩展一些内容,但它也不会这样做。
我知道我可以阅读请求的正文并在其上调用JObject.Parse
(我正在这样做,所以它确实有效),但我从上面的想法看起来更优雅。
这可能吗?
编辑:实际错误是:
System.MissingMethodException: Cannot create an abstract class.
[MissingMethodException: Cannot create an abstract class.]
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
[Stack trace continues...]
请求永远不会进入控制器操作。
根据我的研究JObject
不是抽象的,但为了确定,我这样做了:
public class Entry : JObject
然后
public ActionResult Index([FromBody] Entry data)
没用。同样的错误。
答案 0 :(得分:2)
可能有两个问题。我改变了两件事,它现在有效,但我不能100%确定哪一个修好了。
以下是我改变的两件事 -
首先,我从Pool.map
继承,而不仅仅是ApiController
。我不确定这与它有什么关系。
其次,其他一个答案指出我需要Controller
标题Content-Type
。好吧,它不是。 application/json
标题设置为特定于我们正在整合的软件的一些特殊值。
所以,在Content-Type
中,我添加了这个:
Application_Start
然后它奏效了。
我怀疑这是修复它的第二件事。由于标题没有告诉模型绑定器它是传入的JSON,绑定器试图从头创建一个GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("[crazy ass content-type header value]"));
对象并通过反射分配属性,这会导致问题JObject
是抽象的。一旦它知道它正在处理JSON,它就知道只需要调用JToken
。
答案 1 :(得分:1)
我已为JToken编写了一个ASP.NET Core ModelBinder,您可以安装它 - https://github.com/mcintyre321/AspNetCoreJTokenModelBinder
绑定到JToken,然后在控制器中使用.ToObject<T>()
答案 2 :(得分:0)
您还应该在您的问题中加入JSON的结构。完整的请求会更好。在此之前,请尝试以下方法:
将[FromBody] JObject data
替换为[FromBody] dynamic data
或[FromBody] object data
并查看它是否在行动的第一行遇到断点。
如果是,请查看您的动态实际是什么(类型)。
如果没有,则POST请求可能没有Content-Type: application/json
答案 3 :(得分:0)
问题在于,在反序列化到JObject
类型的某个时刻,它会调用创建一个`JToken&#39;这就是引发异常的地方。这是一个确切的例外:
无法创建抽象类。对象类型 Newtonsoft.Json.Linq.JToken