在ASP.NET Core MVC中使用Ajax调用控制器方法时出现404错误
解决ASP.NET Core MVC部署IIS后Ajax 404问题
核心原因:硬编码URL不兼容IIS虚拟目录
本地运行时网站以根站点形式启动,/Sales/GetAll能正确映射到控制器接口;但部署到IIS时若设置了应用程序别名(虚拟目录),网站实际根路径变为http://域名/别名/,硬编码的绝对路径会跳过别名直接请求根站点,导致接口找不到。
具体解决方案
1. 修正Ajax请求的URL路径
不要硬编码绝对路径,改用站点根路径拼接的方式:
- 在
Index.cshtml中注入站点根路径全局变量:
<script> window.siteRoot = '@Url.Content("~/")'; </script> <script src="~/js/site.js"></script>
- 在
site.js中使用该变量拼接接口地址:
$("#btnSubmit").on("click", (event) => { event.preventDefault(); // 阻止表单默认提交,避免页面刷新中断请求 $.ajax({ url: window.siteRoot + "Sales/GetAll", type: "POST", success: async () => { // 处理成功逻辑 }, error: (xhr) => { console.log(xhr.statusText); // 打印错误信息方便调试 } }) })
2. 阻止表单默认提交行为
按钮为type="submit",点击会触发表单提交导致页面刷新,必须通过event.preventDefault()阻止默认行为,确保Ajax请求能正常完成。
3. 验证IIS部署配置
- 确认应用程序池的.NET CLR版本设置为无托管代码(ASP.NET Core应用必须用此配置);
- 检查站点物理路径是否指向正确的发布文件夹,确保
web.config存在且配置正常; - 核对控制器Action的
[HttpPost]特性、方法名GetAll的拼写和大小写(IIS默认区分大小写,本地环境可能不区分)。
4. 完善控制器返回值
确保Action返回符合ASP.NET Core规范的结果类型,比如JsonResult:
public class SalesController : Controller { [HttpPost] public async Task<IActionResult> GetAll() { // 业务逻辑处理 return Json(new { data = "处理结果" }); } }
内容的提问来源于stack exchange,提问作者Midlaj
相关产品推荐
相关产品推荐

