ASP.Net Core WebAPI中的模型绑定HTTP请求

时间:2019-01-16 20:02:32

标签: c# .net api

我在遇到端点问题时,它接受了一个没有绑定的对象,因此返回了400个错误的请求。

我已经通过传递对象的各个属性而不是对象本身来解决此问题,但希望传递一个对象。

WebClient webClient = new WebClient();
webClient.QueryString.Add("firstName", "value1");
webClient.QueryString.Add("lastName", "value2");
string result = webClient.DownloadString(url);

[HttpGet]
public async Task<IActionResult> DoSomething(string firstName, string lastName)
{ 
   // this endpoint works perfectly
   return Ok();
}

[HttpGet]
public async Task<IActionResult> DoSomething([FromBody]SubmitModel model)
{ 
   // this endpoint returns a 400 bad request
   return Ok();
}

public class SubmitModel
{
   public string FirstName {get; set;}
   public string LastName {get; set;
}

2 个答案:

答案 0 :(得分:1)

根据设计,GET请求包含在请求正文中。 因此,当您的 Submit 方法接收到请求时,由于数据不存在,它无法从主体中绑定模型,因此返回错误的请求响应。

由于您的方法名为 Submit ,因此听起来您应该使用POST请求。根据设计,POST请求在请求正文中发送数据,适合于向服务器提交数据。

尝试一下

[HttpPost]
public async Task<IActionResult> Submit([FromBody]SubmitModel model)
{ 
   // this endpoint returns a 400 bad request
   return Ok();
}

答案 1 :(得分:0)

我不知道是否有很好的方法来做您想要的事情。要更进一步一点,您可以添加此属性以直接从网址中提取

[HttpGet]
public ActionResult Get([FromUri]SubmitModel model)
{ 
   // this endpoint returns a 400 bad request
   return Ok();
}

如果需要,您可以做的另一件事是创建一个扩展方法,该方法可以反映模型并将所有属性/值添加到查询字符串中。 How do I serialize an object into query-string format?

这里的一些很好的例子