AJAX POST 请求 returns 404 .NET 6
AJAX POST request returns 404 .NET 6
我有这个问题:
我正在将 .NET 6 与 MVC 结合使用,并且正在使用 FullcalendarIo。我有一个控制器,用于在日历中制作空闲插槽。这是控制器中的代码:
[Authorize(Roles = DoctorRoleName)]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task < ActionResult < AppointmentSlotInputModel >> GenerateSlots(AppointmentSlotInputModel model) {
//await this.appointmentService.GenerateSlots(model.Start, model.End, model.SlotDurationMinutes);
return Json("Hello");
}
这是我发出 POST 请求的 JS 代码
const params = {
start: startDate,
end: endDate,
slotDurationMinutes: scale
};
const response = await fetch('/Appointment/GenerateSlots', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'RequestVerificationToken': document.getElementById("RequestVerificationToken").value
},
body: JSON.stringify(params)
});
在网络选项卡中,对 /Appointment/GenerateSlots 的请求我得到第一个代码 302 - 重定向,然后是 404 未找到。请求 url 似乎是正确的 - https://localhost:44376/Appointment/GenerateSlots.
f 我将方法更改为 GET 并将 [HttpGet] 属性放在控制器中的操作上方,我得到了 JSON 结果。在 Startup.cs 我使用这些:
services.AddAntiforgery(options => {
options.HeaderName = "X-CSRF-TOKEN";
});
services.Configure < CookiePolicyOptions > (options => {
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
但是,如果我将它们注释掉,结果是相同的 - 首先是 302,然后是 404。我已经尝试了很多在网站上为有类似问题的人编写的代码,但没有帮助.我哪里弄错了?
我正在使用标准路由:
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(
name: "areas",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
编辑:我在这里找到了一个类似的线程 -
但是我好像不是这样。
所以我找到了我的解决方案。在我的 Startup.cs 我有这个代码:
services.AddAntiforgery(options =>
{
options.HeaderName = "X-CSRF-TOKEN";
});
而来自控制器的 BadRequest 是由于 AntiForgeryToken 验证而来的。在我的 AJAX 调用中,我对 AF 令牌的 header 是错误的:它是 'RequestVerificationToken',但它应该是 'X-CSRF-TOKEN' 或相反。但现在我仍然得到了正确的结果,不再有 BadRequest。
我有这个问题:
我正在将 .NET 6 与 MVC 结合使用,并且正在使用 FullcalendarIo。我有一个控制器,用于在日历中制作空闲插槽。这是控制器中的代码:
[Authorize(Roles = DoctorRoleName)]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task < ActionResult < AppointmentSlotInputModel >> GenerateSlots(AppointmentSlotInputModel model) {
//await this.appointmentService.GenerateSlots(model.Start, model.End, model.SlotDurationMinutes);
return Json("Hello");
}
这是我发出 POST 请求的 JS 代码
const params = {
start: startDate,
end: endDate,
slotDurationMinutes: scale
};
const response = await fetch('/Appointment/GenerateSlots', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'RequestVerificationToken': document.getElementById("RequestVerificationToken").value
},
body: JSON.stringify(params)
});
在网络选项卡中,对 /Appointment/GenerateSlots 的请求我得到第一个代码 302 - 重定向,然后是 404 未找到。请求 url 似乎是正确的 - https://localhost:44376/Appointment/GenerateSlots.
f 我将方法更改为 GET 并将 [HttpGet] 属性放在控制器中的操作上方,我得到了 JSON 结果。在 Startup.cs 我使用这些:
services.AddAntiforgery(options => {
options.HeaderName = "X-CSRF-TOKEN";
});
services.Configure < CookiePolicyOptions > (options => {
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
但是,如果我将它们注释掉,结果是相同的 - 首先是 302,然后是 404。我已经尝试了很多在网站上为有类似问题的人编写的代码,但没有帮助.我哪里弄错了? 我正在使用标准路由:
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(
name: "areas",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
编辑:我在这里找到了一个类似的线程 -
所以我找到了我的解决方案。在我的 Startup.cs 我有这个代码:
services.AddAntiforgery(options =>
{
options.HeaderName = "X-CSRF-TOKEN";
});
而来自控制器的 BadRequest 是由于 AntiForgeryToken 验证而来的。在我的 AJAX 调用中,我对 AF 令牌的 header 是错误的:它是 'RequestVerificationToken',但它应该是 'X-CSRF-TOKEN' 或相反。但现在我仍然得到了正确的结果,不再有 BadRequest。