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;
});