我正在尝试从 jQuery 发布到我的 ASP.NET Core (RC1) API。当我通过 HttpClient POST 时它工作正常,所以我认为这只是我错过的一件愚蠢的事情。
我可以在普通默认 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; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
客户
$.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);
});
Run Code Online (Sandbox Code Playgroud)
我尝试删除[FromBody],它返回一个模型,但属性从未填充。我还针对 SO 上的类似问题尝试了许多解决方案和变通方法,但我认为它们不适用于 .NET Core 或者仅使用 inf[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);
});
Run Code Online (Sandbox Code Playgroud)
请注意,这contentType是必需的,没有它,模型绑定将无法工作。
当然,我之前已经尝试过这个客户端代码,但是 CORS 搞砸了:CORS 有一个 OPTION 请求来确定请求是否有效。浏览器的 F12 工具并没有让这一点变得显而易见。有趣的是,我在调试器中收到了 OPTION 请求(这就是我认为它有效的原因),但我最终通过 Fiddler 发现contentType这些请求中的标头未正确传输 - 这就是模型未正确绑定的原因。
| 归档时间: |
|
| 查看次数: |
2565 次 |
| 最近记录: |