ASP.NET Core 2.0 MVC部署IIS后Axios调用接口返回404问题
我完全懂你碰到的这个头疼问题——本地在Visual Studio里跑的时候,axios调用Items/GetUnclaimedItems顺顺当当拿数据,可一部署到IIS就直接报404,偏偏Index视图能正常加载,用Postman测同样的路径也不行。这种情况大多和路由配置或者IIS的反向代理设置有关,咱们一步步来排查解决:
1. 先搞定相对路径的坑
你现在axios用的是相对路径"Items/GetUnclaimedItems",如果部署到IIS后你的站点不是根站点(比如站点挂在http://yourdomain/yourAppName/下面),那这个相对路径就会拼错,变成http://yourdomain/Items/GetUnclaimedItems,自然找不到接口。
建议用ASP.NET的Url.Action来生成绝对正确的URL,在视图里先定义:
<script> // 用Url.Action生成对应Action的完整路径 const getUnclaimedItemsUrl = '@Url.Action("GetUnclaimedItems", "Items")'; </script>
然后axios调用时用这个变量:
axios.get(getUnclaimedItemsUrl) .then(function (response) { _this.items = response.data; _this.isBusy = false; }) .catch(function (err) { alert("Error getting items. " + err); });
这样不管部署在什么层级的站点下,都会生成正确的请求路径,从根源避免路径错误导致的404。
2. 检查IIS的ASP.NET Core模块配置
ASP.NET Core部署到IIS必须依赖ASP.NET Core Module(ANCM),这个模块负责把IIS接收到的请求转发到.NET Core的自托管进程里。如果模块没装对或者配置错了,请求根本到不了你的应用:
- 确保服务器上安装了ASP.NET Core 2.0 Runtime Hosting Bundle,这个包包含了ANCM,去微软对应版本的下载页面就能找到;
- 检查站点的应用程序池,一定要设置为无托管代码——因为ASP.NET Core是自己托管的,IIS只是个反向代理,不需要它的托管环境。
3. 给控制器显式加路由特性
虽然你配置了默认路由,但有时候显式指定路由模板会更可靠,避免默认路由的匹配歧义。给你的ItemsController和Action加上路由特性:
[Route("[controller]/[action]")] public class ItemsController : Controller { [HttpGet] public JsonResult GetUnclaimedItems() { Log.Information("Getting unclaimed items"); // 你的业务代码... return Json(itemsList); } }
这样明确告诉路由系统,这个Action的访问路径就是Items/GetUnclaimedItems,不会出现匹配不到的情况。
4. 确认部署的物理路径正确
有时候部署时不小心把IIS站点的物理路径指向了项目源码目录,而不是发布后的输出目录。检查一下:你的站点物理路径应该指向你发布项目时生成的publish文件夹(发布时选择的输出路径),这个文件夹里包含了运行所需的所有文件。
5. 查日志找线索
你代码里已经加了Log.Information,部署后去看看日志文件,确认GetUnclaimedItems这个Action有没有被命中:
- 如果日志里没有这条信息,说明请求根本没到达你的应用,重点排查IIS的ANCM配置或者站点路径;
- 如果有日志但还是返回404,那可能是Action内部的逻辑问题,但这种情况比较少见。
另外,也可以在IIS里开启失败请求跟踪,捕获404请求的详细处理流程,能帮你精准定位到哪一步出了问题。
一般来说,先排查相对路径和ANCM配置这两个点,就能解决大部分这类404问题。
内容的提问来源于stack exchange,提问作者Daniel Jackson

