Server 2012 IIS 8.5中WebApi与MVC路由失效(404.0错误)
这种情况我之前在部署.NET WebAPI+MVC应用时碰到过好几次,结合你说的静态test.aspx能正常访问但所有路由返回404的现象,核心问题应该是IIS没有正确加载ASP.NET的路由处理模块,或者应用池/配置存在不兼容的情况。给你列几个按优先级排序的排查和解决步骤,你挨个试应该能搞定:
检查应用池的托管模式和.NET版本:
这是最常见的坑!IIS管理器中找到你的应用池,右键选择「高级设置」,确保:- .NET CLR版本 设置为
v4.0.30319(对应.NET Framework 4.7.1) - 托管管道模式 设置为 集成模式(经典模式下路由模块无法正常工作)
改完后重启应用池。
- .NET CLR版本 设置为
重新注册ASP.NET 4到IIS:
有时候服务器上虽然安装了.NET Framework,但没有正确注册到IIS中。打开管理员权限的命令提示符,运行以下命令:%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i如果你的服务器是64位系统,也可以同时运行64位版本的命令:
%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i执行完成后,运行
iisreset重启IIS服务。确认UrlRoutingModule模块已加载:
在IIS管理器中进入你的网站,点击左侧的「模块」,检查列表中是否存在UrlRoutingModule-4.0。如果没有,手动添加:- 点击右侧的「添加托管模块」
- 名称填
UrlRoutingModule-4.0,类型选择System.Web.Routing.UrlRoutingModule - 勾选「仅针对请求向ASP.NET应用程序或托管处理程序发出调用时调用」,点击确定。
检查web.config中的路由相关配置:
确保你的web.config的<system.webServer>节点包含以下配置,让IIS把无扩展名的请求交给ASP.NET路由处理:<modules runAllManagedModulesForAllRequests="true"> <remove name="UrlRoutingModule-4.0" /> <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" /> </modules> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandler" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers>注意:
runAllManagedModulesForAllRequests="true"会让所有请求都经过托管模块,虽然有点性能损耗,但能解决大部分路由识别问题。排查IIS请求筛选规则:
有时候IIS的请求筛选会拦截路由请求:- 进入网站的「请求筛选」功能
- 切换到「HTTP动词」标签,确保GET、POST、PUT、DELETE等你用到的动词都处于允许状态
- 切换到「隐藏段」标签,检查是否有和你的路由路径相关的条目,如果有就删除。
验证ASP.NET运行环境:
在网站根目录新建一个check.aspx文件,内容如下:<%@ Page Language="C#" %> <!DOCTYPE html> <html> <body> <h1>.NET Version: <%= System.Environment.Version.ToString() %></h1> </body> </html>访问这个页面,如果能正常显示.NET 4.x的版本,说明ASP.NET基础运行环境是正常的;如果无法显示,回到前面的步骤检查应用池和ASP.NET注册情况。
内容的提问来源于stack exchange,提问作者Tyler Wright

