ASP.NET MVC路由异常:IE报错Chrome正常,无尾斜杠触发问题
ASP.NET MVC中IE下无尾斜杠URL触发路由异常的问题
嘿,这个IE独有的路由坑我之前踩过!刚好能给你说清楚来龙去脉和解决办法:
问题复现细节
- 在ASP.NET MVC项目里,当访问的URL末尾不带斜杠时,路由到非默认控制器的Action方法会触发异常
- 诡异的是,Chrome、Firefox这些浏览器完全没问题,只有Internet Explorer会出问题
- 调试时能看到路由引擎其实已经完成了路由匹配,但IE还是会抛出异常;只要给URL加上末尾的斜杠,一切就恢复正常了
背后的原因推测
结合路由引擎的工作逻辑和IE的URL处理特性,大概率是这两者的交互出了问题:
ASP.NET MVC的路由引擎默认会优先尝试匹配默认的
IndexAction(也就是默认路由里的defaults: new { action = "Index", id = UrlParameter.Optional }),当找不到对应的匹配项时,才会去匹配传入的具体控制器和Action路径。而IE在处理无尾斜杠的URL时,会对请求做特殊的解析或跳转处理,刚好和路由引擎的这个优先匹配逻辑撞了车,最终导致异常抛出。
解决办法
这里给你两个靠谱的解决方向:
1. 强制给URL添加末尾斜杠
通过URL重写规则,自动给所有非文件、非目录的无尾斜杠URL加上斜杠,从根源上避免触发IE的异常逻辑。可以在web.config里添加如下配置:
<system.webServer> <rewrite> <rules> <rule name="Add Trailing Slash" stopProcessing="true"> <match url="(.*[^/])$" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Redirect" url="{R:1}/" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer>
2. 调整路由匹配顺序
修改RouteConfig.cs里的路由配置,把你的具体控制器Action路由规则放在默认路由的前面,让路由引擎优先匹配具体路径,而不是先去尝试默认的Index Action。比如:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 先配置具体的路由规则 routes.MapRoute( name: "CustomRoute", url: "YourController/YourAction/{id}", defaults: new { controller = "YourController", action = "YourAction", id = UrlParameter.Optional } ); // 再配置默认路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
内容的提问来源于stack exchange,提问作者chuckd
相关产品推荐
相关产品推荐

