You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何相同POST请求在Postman可用,浏览器AJAX却报404?

问题原因分析与解决办法

我来帮你拆解下这个问题的核心原因,以及对应的修复方案:

核心问题:CORS预检请求未被处理

你的Postman请求能成功,是因为Postman不会触发浏览器的跨域预检机制;但jQuery AJAX设置了crossDomain: true,浏览器会先发送一个OPTIONS预检请求来验证跨域权限。而你的WebAPI虽然在配置里调用了config.EnableCors(),但没有在控制器上标记[EnableCors]属性,导致WebAPI无法识别这个OPTIONS请求,直接返回404错误,进而浏览器终止了后续的POST请求——你看到的错误其实是OPTIONS请求的响应结果。

另外还有两个潜在的小问题,虽然不是直接导致404的原因,但也可能影响请求稳定性:

  1. 手动拼接的JSON字符串可能存在格式隐患
  2. 属性路由的配置不够明确,容易和默认路由产生混淆

具体修复步骤

1. 正确配置CORS(解决404的关键)

首先确保你已经安装了Microsoft.AspNet.WebApi.Cors NuGet包,然后在你的StudentsController上添加[EnableCors]属性:

using System.Web.Http.Cors;

// 生产环境请将origins改为你的前端域名,不要用*
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class StudentsController : ApiController
{
    // 你的Post方法及其他控制器逻辑
}

添加这个属性后,WebAPI会自动处理OPTIONS预检请求,浏览器就能正常发送POST请求了。

2. 优化AJAX请求的数据格式

避免手动拼接JSON字符串,改用JSON.stringify()生成标准的JSON数据,减少格式错误风险:

var studentData = {
    "FirstName": "Sample",
    "LastName": "Sample",
    "City": "Sample",
    "ListOfCourses": []
};

var settings = {
    "async": true,
    "crossDomain": true,
    "url": "http://localhost:59523/api/students",
    "method": "POST",
    "headers": {
        "content-type": "application/json"
    },
    "processData": false,
    "data": JSON.stringify(studentData)
};

$.ajax(settings).done(function (response) {
    console.log(response);
});

3. 明确路由前缀(可选但推荐)

为了让路由规则更清晰,避免属性路由和默认路由的冲突,建议给控制器添加[RoutePrefix]属性:

[RoutePrefix("api/students")]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class StudentsController : ApiController
{
    [HttpPost, Route("")]
    public IHttpActionResult Post([FromBody] StudentDto student)
    {
        // 你的方法逻辑
    }
}

这样你的Post方法的路由就明确对应api/students,和请求URL完全匹配,不会产生歧义。

内容的提问来源于stack exchange,提问作者Izi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:55:34