c# – 在ASP.NET MVC中,我可以自动从POST主体建模到JObject的绑定吗?
作者:互联网
我有一个控制器操作,它将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)
没工作.同样的错误.
解决方法:
可能有两个问题.我改变了两件事,它现在有效,但我不能100%确定哪一个修好了.
以下是我改变的两件事 –
首先,我继承自ApiController,而不仅仅是Controller.我不确定这与它有什么关系.
其次,其中一个答案指出我需要具有application / json的正确Content-Type标头.嗯,事实并非如此. Content-Type标头设置为特定于我们正在集成的软件的一些特殊值.
所以,在Application_Start中,我添加了这个:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("[crazy ass content-type header value]"));
然后它奏效了.
我怀疑这是修复它的第二件事.由于标题没有告诉模型绑定器它是传入的JSON,绑定器试图从头创建一个JObject对象并通过反射分配属性,这些问题遇到了JToken的抽象问题.一旦它知道它正在处理JSON,它就知道只需要调用JObject.Parse.
标签:json,c,asp-net-mvc,json-net,model-binding 来源: https://codeday.me/bug/20190627/1308811.html