.NET Core 2.0 MVC部署IIS后仅控制器方法报404求助
排查建议:.NET Core 2.0 IIS部署下控制器方法404问题
结合你描述的场景(IIS Express正常、仅部署到IIS后特定路径404),我整理了几个针对性的排查方向,按优先级排序:
1. 先修正路由配置的控制器名称约定
你的路由模板写的是{controller=MyController}/{action=Index}/{id?},但.NET Core的路由有个核心约定:控制器名称要自动去掉Controller后缀。也就是说,MyController对应的路由片段应该是My,而非MyController。
举个实际访问的例子:
- 要调用
Check方法,正确路径应该是http://localhost/My/Check?objectUID=xxx&idfv=xxx - 如果你的实际控制器是
HomeController,那路径就是http://localhost/Home/Check
如果之前在IIS Express里用的是符合约定的路径,部署到IIS后误用了带Controller后缀的路径,就会直接触发404,这是最容易踩的坑。
2. 检查IIS的AspNetCoreModule配置
.NET Core应用在IIS上运行完全依赖AspNetCoreModule(对应.NET Core 2.0的版本),如果这个模块没正确安装或映射,IIS会无法把深层路径的请求转发给你的应用,直接返回404:
- 打开IIS管理器,查看站点的模块列表,确认
AspNetCoreModule存在 - 检查站点的处理程序映射,有没有一条路径为
*、模块为AspNetCoreModule的规则 - 如果缺失,重新安装.NET Core 2.0的Windows Server Hosting捆绑包,安装时确保勾选IIS相关组件
3. 通过web.config和日志定位请求流向
发布后的web.config是IIS和.NET Core的中间桥梁,重点检查:
- 确认
AspNetCore节点的processPath和arguments是否正确:比如processPath="dotnet",arguments=".\YourApp.dll",路径要指向正确的应用程序集 - 把
stdoutLogEnabled设为true,设置stdoutLogFile为.\logs\stdout,然后重新请求404路径:- 如果日志里完全没请求记录,说明IIS根本没把请求转发给应用,问题出在IIS配置
- 如果有请求记录,查看是否有路由匹配失败的提示,或者应用抛出的异常信息
4. 清理发布目录后重新发布
你提到切换过Debug/Release模式,很可能存在旧文件残留的问题:
- 完全清空发布目标文件夹的所有内容
- 在Visual Studio里切回Release模式,重新执行发布,确保所有文件都是最新的Release版本
- 发布完成后重启IIS站点,避免缓存干扰
5. 验证HTTP请求方法是否匹配
你的方法都标注了明确的HTTP特性:
Store是[HttpPost],必须用POST方法访问,用GET请求会直接404Check和Retrieve是[HttpGet],参数要放在QueryString里(比如?objectUID=xxx&idfv=xxx)
可以用Postman或curl工具验证请求方法是否正确,排除因方法不匹配导致的404。
6. 检查IIS的URL重写规则
如果你的站点配置了自定义URL重写规则,可能会拦截深层路径的请求:
- 打开IIS管理器,查看站点的URL重写规则,确认没有规则会将
/controller/method这类路径重定向或拦截 - 暂时禁用所有自定义重写规则,测试是否能正常访问方法
内容的提问来源于stack exchange,提问作者NSGangster
相关产品推荐
相关产品推荐

