![](/img/trans.png)
[英]Asp.net core mvc ajax post to controller with multiple parameters return bad request
[英]ASP.NET Core MVC - Why does Ajax JSON request return 400 on POST instead of 403
我有一个 ASP.NET 核心 MVC 应用程序。 如果我正在使用dataType: "json"
执行 AJAX POST,并且我返回 Forbid Forbid()
那么我总是会收到400 Bad Request
而不是返回403 Forbidden
。 但是在 GET 请求的情况下,将返回403 Forbidden
以下示例 - 我正在使用 .NET Core 6 和这个启动脚本:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseExceptionHandler("/Error/");
app.UseStatusCodePagesWithReExecute("/Error/{0}");
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseMiddleware<SerilogMiddleware>();
app.UseSerilogRequestLogging();
app.UseAuthorization();
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}")
.RequireAuthorization();
});
}
Controller:
public class HomeController : Controller
{
public ActionResult Get()
{
return Forbid();
}
[HttpPost]
[IgnoreAntiforgeryToken] //just for demo to keep it simple
public ActionResult Post()
{
return Forbid();
}
}
Ajax 请求:
$.ajax({
type: "GET",
url: "Home/Get",
dataType: "json",
contentType: "application/json",
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest.status);
},
success: function() {
console.log('success');
}
});
$.ajax({
type: "POST",
url: "Home/Post",
dataType: "json",
contentType: "application/json",
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest.status);
},
success: function() {
console.log('success');
}
});
GET-Request 返回403 Forbidden
, POST-Request 返回400 Bad Request
。
为什么 POST-Request 也不返回403 Forbidden
? 如果我没有设置dataType
和contentType
,那么 POST-Request 也会返回403 Forbidden
。
特别是我还想在 JSON-Ajax 调用上处理403 Forbidden
和401 Unauthorized
。 我怎样才能做到这一点?
如果我没有设置 dataType 和 contentType,那么 POST-Request 也会返回 403 Forbidden。
这是弄清楚发生了什么的关键。 您正在将内容类型设置为 application/json,但您发送的是一个空正文。 空体无效 JSON
在 ASP.NET 中,内容协商(反序列化您的输入的位。在 controller 主体之前运行。如果失败,则取决于失败的来源,它将为 400 或 405。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.