【问题标题】:AJAX POST request returns 404 .NET 6AJAX POST 请求返回 404 .NET 6
【发布时间】:2022-01-20 04:59:40
【问题描述】:

我有这个问题:

我正在使用带有 MVC 的 .NET 6,并且正在使用 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 Not Found。请求网址似乎正确 - 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?}");
});

编辑:我在这里找到了一个类似的帖子 - ASP.NET controller, AJAX GET works, but POST does not (404) 但对我来说似乎不是这样。

【问题讨论】:

  • 问题出在路由部分。不在这里
  • 如果我将方法更改为 Get 并放置一个属性 [HttpGet] 它会返回正确的结果。
  • 所以在你的路由器中,你不会为 POST 请求处理这个地址。只需在路由器部分编辑附加到此 URL 的方法
  • 我只使用默认路由:endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");我尝试使用 [Route("appointment/generateSlots")] 属性,但都一样。
  • 你能试试 GenerateSlots([FromBody] AppointmentSlotInputModel model) 吗?

标签: javascript c# ajax asp.net-core .net-6.0


【解决方案1】:

所以我找到了我的解决方案。在我的 Startup.cs 我有这个代码:

    services.AddAntiforgery(options =>
    {
        options.HeaderName = "X-CSRF-TOKEN";
    });

来自控制器的 BadRequest 是因为 AntiForgeryToken 验证。在我的 AJAX 调用中,我的 AF 令牌标头是错误的:它是“RequestVerificationToken”,但它应该是“X-CSRF-TOKEN”或其他方式。但现在我仍然有正确的结果,不再有 BadRequest。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多