子应用程序中的Asp.net MVC Catchall路由

我有一个MVC应用程序,其子应用程序在IIS中运行另一个MVC项目。 两者都使用相同的版本框架并在单独的应用程序池上运行。

我的问题是,我无法让子应用程序在根网站的这个虚拟应用程序文件夹中工作。 我收到403.14 Forbidden错误 。 如果我在子应用程序上启用目录列表,我只需获取MVC应用程序文件的列表。

我想,我已将问题缩小到路由; 子应用程序有一个自定义catchall路由,它处理对站点的所有请求,它是一个CMS应用程序。 没有注册其他路线。 这是我的自定义路线的代码:

RouteTable.Routes.Insert(0,new CmsRoute( "{*path}", new RouteValueDictionary(new { controller = "Page", action = "Index" }), new MvcRouteHandler())); 

在自己的站点中的主根应用程序之外运行此应用程序,它工作正常,所有请求都由我的自定义路由处理。 但是当我尝试将其作为子应用程序运行时,路由处理程序永远不会被命中。 如果我添加开箱即用的标准默认MVC路由:

 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 

然后MVC启动并尝试为请求找到匹配路由。

所以我的问题是为什么我的catchall路由在IIS中的子应用程序中运行时不起作用?

注意:我尝试使用虚拟应用程序文件夹的名称为我的自定义路由中的url加前缀,但它仍然不起作用,例如:

  RouteTable.Routes.Insert(0,new CmsRoute( "subapplication/{*path}", new RouteValueDictionary(new { controller = "Page", action = "Index" }), new MvcRouteHandler())); 

如果这不会损害您的目的,请使用子域而不是子应用程序。

但是,如果您一定要这样做,请记住,应用程序和子应用程序必须在相同版本的.NET上运行。

此外,与web.configs存在父/子关系 – 因此子应用程序将inheritance父web.config,除非在配置中使用’inheritInChildApplications’告知不要这样做。 但是,这也可能让你头疼与孩子发生冲突。 如果您想尝试父/子关系,这里有一个解决方案(头痛)。 http://articles.runtings.co.uk/2010/04/solved-iis7-validateintegratedmodeconfi.html

当您从客户端向应用程序发送请求时,除非您专门拨打电话,否则它不会转移到其他应用程序(如子应用程序)。 这就是为什么你的子应用程序在你直接访问它时工作正常但在你尝试通过父进程实现它时失败的原因。 路由是关于请求的,它是获得负责路由问题的请求的应用程序。

因此,您需要做的是实际重定向到您的子应用程序。 您的子应用程序应该有一个单独的URL(子域可以正常)。 代码应如下所示:

 public ActionResult YourAction() //Action in the main application { var subAppUrl = "http://yourSubApplicationUrl?AnyOtherQueryStringSetToPassData"; return Redirect(subAppUrl); } 

如果您使用Ajax调用该操作,那么它应该是:

 public JsonResult YourAction() //Action in the main application { var subAppUrl = "http://yourSubApplicationUrl?AnyOtherQueryStringSetToPassData"; return Json(new {url = subAppUrl }); } 

和相应的JQuery:

 $.post("@Url.Action("YourAction")", function(data) { window.location = data.url; });