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

本文关键字:MVC 全局 路由 net Asp 应用程序 | 更新日期: 2023-09-27 18:05:36

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

我的问题是,我无法让子应用程序在根站点的这个虚拟应用程序文件夹中工作。我得到一个403.14禁止错误。如果我在子应用程序上启用目录列表,我就会得到MVC应用程序文件的列表。

我想,我已经把问题缩小到路由;子应用程序有一个自定义的捕获路由来处理对站点的所有请求,这是一个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()));

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

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

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

此外,还与web存在父/子关系。配置——这样子应用程序将继承父应用程序的web。除非在配置中使用'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;
});

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

  • RootApp /

    • SubApp1/SubApp1
    • SubApp2/SubApp2

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

和. .你应该在根应用中删除到SubApp1的MapRoute,如果它已经被管理了!