Asp.net MVC Catchall Routing в суб-приложении

У меня есть приложение MVC с дополнительным приложением, запускающим другой проект MVC в IIS. Оба используют одну и ту же оболочку версии и запускаются в отдельных пулах приложений.

Моя проблема заключается в том, что я не могу заставить вспомогательное приложение работать внутри этой виртуальной папки приложения корневого сайта. Я получаю 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 запускается и пытается найти маршрут соответствия для запроса.

Итак, мой вопрос в том, почему мой общий маршрут не будет работать во время работы в подпрограмме в IIS?

Примечание. Я пробовал префикс url в моем настраиваемом маршруте с именем папки виртуального приложения, но он все еще не работает, например:

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

       new MvcRouteHandler()));

Ответы

Ответ 1

Используйте поддомен, а не под-приложение, если это не повредит вашей цели.

Но, если вы обязаны это сделать, помните, что приложение и вспомогательное приложение должны работать в одной и той же версии .NET.

Кроме того, существует родительское/дочернее отношение с web.configs - поэтому дочернее приложение наследует родителей web.config, если не будет сказано, чтобы это не выполнялось с использованием функции inheritInChildApplications в конфигурациях. Но это может также дать вам головную боль, связанное с конфликтом с ребенком. вот решение этого (головная боль), если вы хотите попробовать отношения между родителями и детьми. http://articles.runtings.co.uk/2010/04/solved-iis7-validateintegratedmodeconfi.html

Ответ 2

Когда вы отправляете запрос от клиента к приложению, он не переносится в другое приложение (например, ваше под-приложение), если вы специально не совершаете вызов. Именно поэтому ваше подзадача отлично работает, когда вы обращаетесь к нему напрямую, но не удается, когда пытаетесь достичь его через родителя, как вы это делаете. Маршрутизация - это запросы, и это приложение, получившее запрос, который отвечает за проблемы маршрутизации.

Итак, что вам нужно сделать, это сделать реальную переадресацию на ваше под-приложение. У вашего суб-приложения должен быть отдельный 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;
});