在IIS中嵌套部署MVC应用后子应用无法访问的解决方法咨询
解决MVC父应用拦截子应用请求的问题
这种情况太常见了——父MVC应用的路由模块会把所有指向子应用的请求都当成自己的路由来处理,自然就找不到对应的控制器报错了。不用单独开两个网站,按下面的步骤来就能搞定:
方法一:在父应用的Web.config里排除子应用路径
直接通过配置让父应用的路由模块别管子应用的请求,最直接有效:
在父应用的web.config里添加<location>节点,指定子应用的路径,然后移除父应用的Url路由模块对这个路径的控制:
<location path="testsite2"> <system.webServer> <modules> <remove name="UrlRoutingModule-4.0" /> </modules> </system.webServer> </location>
这样一来,所有发往local.testsite1/testsite2的请求都会直接转发给子应用,不会被父应用的路由拦截。
方法二:在父应用的路由配置里忽略子应用路径
如果你不想改Web.config,也可以在父应用的路由规则里直接排除子应用的路径:
打开父应用的RouteConfig.cs,在注册路由的方法里添加一条忽略路由的规则:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 关键:忽略子应用的所有请求路径 routes.IgnoreRoute("testsite2/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
这条规则会告诉父应用的路由系统,所有以testsite2开头的请求都直接跳过,交给子应用处理。
额外注意事项
- 确保子应用的IIS配置正确:在IIS里设置子应用时,要选择合适的应用程序池——如果子应用和父应用的.NET版本不同,一定要用独立的应用程序池;版本相同的话共用也可以,但分开更不容易出冲突。
- 检查子应用的路由:子应用的路由配置保持默认的相对路径就行,不要写绝对路径,这样它才能正确识别相对于
testsite2的请求。 - 测试前重启IIS:修改配置后最好重启一下IIS或者对应的应用程序池,确保配置生效。
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

