我正在尝试从jQuery发布到我的ASP.NET Core(RC1)API。当我通过HttpClient进行发布时,它工作正常,所以我认为这只是我所缺少的愚蠢的东西。
我可以在默认的ASP.NET 5项目和此代码上重现我的问题。
服务器
namespace WebApplication1.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
[HttpPost]
public IActionResult Post([FromBody]Model input)
{
// input is always null
return Json(input.Value);
}
public class Model
{
public string Value { get; set; }
}
}
}
客户
$.ajax({
url: "http://localhost:5000/api/values",
method: "POST",
contentType: "application/json",
dataType: "json",
data: JSON.stringify({
Value: "some_value"
})
}).done(function(data) {
console.log("Done.", data);
});
我通过移除进行操作[FromBody]
,这返回了一个模型,但是从未填充过属性。我还尝试了针对SO上类似问题的许多解决方案和变通办法,但我认为它们不适用于.NET Core或仅解决usinf[FromBody]
和简单类型的问题。例如,Web Api参数始终为null或使用jQuery post到ASP.Net webapi或http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/
我花了几个小时才终于找到答案。正如我担心/希望的那样,那只是一件事愚蠢:
Fiddler发现我的CORS配置有小问题。意识到我完全在Chrome中禁用了CORS,它突然开始起作用了。服务器端代码按原样工作,这是最小的工作客户端代码:
$.ajax({
url: "http://localhost:5000/api/values",
method: "POST",
contentType: "application/json",
data: JSON.stringify({
value: "some_value"
})
}).done(function(data) {
console.log("Done.", data);
});
请注意,这contentType
是必需的,否则,模型绑定将无法工作。
当然,我之前曾尝试过此客户端代码,但CORS却把它搞砸了:对于CORS,有一个OPTION请求,以确定该请求是否有效。浏览器F12工具并没有使它看起来那么明显。有趣的是,我在调试器中收到了OPTION请求(这就是我认为它起作用的原因),但是我最终通过Fiddler发现contentType
,这些请求中的标头未正确传输-这就是模型未正确绑定的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句