Web API不能用GET绑定不变的对象,但可以使用帖子



我想用GET方法绑定不变的模型。它的帖子很好。为什么?

    [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]属性有关?

[FromBody]将标志属于MVC管道,以使用配置的格式器来绑定请求主体的数据。基于请求的内容类型选择了格式器。

JsonInputFormatter是基于json.net的默认格式,它只是进行JSON String Body pelelialization(代码(:

 model = jsonSerializer.Deserialize(jsonReader, type);

原因在避难所中未调用对象的构造函数,您没有任何错误,例如" 必须具有无参数构造函数"。


相反,对于[FromQuery]Something,使用了复杂Typemodelbinder,它首先通过调用默认构造函数来创建Something类的实例,然后将相应的值分配给公共属性。检查BindModeLcoreasync方法以获取实现详细信息。

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

[FromQuery]Something something参数期望您发送该类型的对象。您不能在Querystring中执行此操作,因为它只能采用"简单类型",例如intstring

相关内容

最新更新