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

Asp.net MVC Catchall Routing in a Sub Application

我有一个 MVC 应用程序和一个子应用程序 运行在 IIS 中连接另一个 MVC 项目。两者在不同的应用程序池上使用相同的版本框架和 运行。

我的问题是,我无法让子应用程序在根站点的这个虚拟应用程序文件夹中运行。我收到 403.14 禁止错误。如果我在子应用程序上启用目录列表,我只会得到 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()));

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

所以您需要做的是实际重定向到您的子应用程序。您的子应用程序应该有一个单独的 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;
});

如果不影响您的目的,请使用子域而不是子应用程序。

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

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

您的子应用程序已经是路径:

  • RootApp /

    • 子应用程序 1 /子应用程序 1
    • 子应用2 /子应用2

      routes.MapRoute(
          "SubApp1", // Route name
          "{*url}", // URL with parameters
          new
          {
              controller = "Controller",
              action = "Action",
              id = UrlParameter.Optional
          }
      );
      

并且..如果已经管理,您应该在根应用程序上删除到您的 SubApp1 的 MapRoute!