Web API不能使用GET绑定Immutable对象,但可以使用POST

时间:2018-03-23 21:46:46

标签: c# .net-core model-binding asp.net-core-webapi

我想用GET方法绑定Immutable模型。它适用于POST。为什么?

    [HttpGet]
    public string Get([FromQuery]Something something)
    {
        return "value";
    }

    [HttpPost]
    public void Post([FromBody]Something something)
    {
    }



    public class Something
    {
        public string Prop1 { get; }
        public int Prop2 { get;  }

        public Something(string prop1, int prop2)
        {
            Prop1 = prop1;
            Prop2 = prop2;
        }
    }

使用GET方法我得到例外:

  

InvalidOperationException:无法创建类型的实例   WebApplication2.Something ;.模型绑定的复杂类型不能是   抽象或值类型,并且必须具有无参数构造函数。

是否与[FromQuery][FromBody]属性有关?

2 个答案:

答案 0 :(得分:2)

[FromBody]属性标记到MVC管道,以使用配置的格式化程序绑定来自请求主体的数据。根据请求的内容类型选择格式化程序。

JsonInputFormatter是默认格式化程序,基于Json.NET,它只是执行JSON字符串体反序列化(code):

 model = jsonSerializer.Deserialize(jsonReader, type);

在反序列化过程中导致对象的构造函数没有被调用,你不会有任何错误,例如" 必须有一个无参数构造函数"。

相反,对于[FromQuery]Something,使用ComplexTypeModelBinder,它首先通过调用默认构造函数创建Something类的实例,然后将相应的值分配给公共属性。检查BindModelCoreAsync method for implementation details

答案 1 :(得分:1)

[HttpGet]
public string Get([FromQuery]Something something)
{
    return "value";
}

[FromQuery]Something something参数要求您发送该类型的对象。你不能在查询字符串中这样做,因为它只能接受"简单类型"例如intstring