Могу ли я иметь традиционные веб-приложения ASP.NET в виртуальных каталогах под сайтом MVC?
Это сценарий, который работает уже много лет. У меня есть родительское веб-приложение asp.net на (скажем) www.MySite.co.uk, и под ним у меня есть несколько дочерних (клиентских) сайтов в виртуальных каталогах, например. www.MySite.co.uk/Client1 и т.д. Все сайты (родительские и дочерние виртуальные каталоги) являются традиционными приложениями веб-форм asp.net, использующими .NET 4.5, и все работает нормально.
Вчера я обновил свой родительский сайт как веб-приложение asp.net MVC 5 (разработанное для меня фрилансером). Я только обновил родительский сайт, и он сломал все мои дочерние сайты. В качестве чрезвычайного решения для этого я переименовал файл web.config на моем родительском веб-сайте MVC, очевидно, это сломало мой родительский сайт, но по крайней мере клиентские (дочерние) сайты снова работают.
Очевидно, что в корневом приложении (MVC один), который веб-сайты наследуют, они имеют значение, и им это не нравится.
В моем исследовании я натолкнулся на это: http://forums.iis.net/t/1200821.aspx?Creating+virtual+directory+for+ASP+NET+website+under+MVC+application, и поэтому я задаюсь вопросом, относится ли эта настройка к моему MVC RouteConfig.cs файл. Мой фрилансер настроил его так, чтобы старые ссылки на мои пути aspx все равно работали (т.е. Отображали мои новые представления). Я еще не знаком с кодом, но вот фрагмент:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "HelpRedirect",
url: "Help/{*route}",
defaults: new { controller = "Help", action = "ViewRedirect" }
);
routes.MapRoute(
name: "AspxRoute",
url: "{controller}/{action}.aspx",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "ContactRoute",
url: "Contact.aspx",
defaults: new { controller = "Contact", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Я много искал, но до сих пор не смог найти решение. Поэтому мой вопрос таков:
- Возможно ли иметь традиционный сайт asp.net в виртуальном каталоге под сайтом MVC?
- Если да, то какие настройки следует искать? Как остановить дочерние сайты, наследующие неправильные настройки? У меня такое ощущение, что настройки находятся либо в файле web.config, либо что-то вроде RouteConfig.cs выше.
Я был бы очень благодарен, если бы кто-нибудь мог указать мне в правильном направлении, спасибо заранее.
Обновление
Также посмотрел этот пост Приложение Virtual Directory в приложении MVC Asp.net Я попытался редактировать web.config в корневом приложении и обернуть <location inheritInChildApplications="false">
вокруг все, что позволит. Но это не сработало, клиентские сайты все еще не работали.
Обновление 2
У меня есть ответ от моего фрилансера, который говорит, что речь идет о маршрутизации и URL-адресе, потому что MVC ожидает что-то в /Client 1 и т.д. Поэтому нам нужно написать маршрут, который отправляет такие запросы (маршрут плюс одно слово) контроллеру, который то нужно выяснить, является ли это страницей в MVC (например,/help) или клиентским сайтом (например, Client1) и отображать соответствующую страницу.
Лично я не знаю достаточно о маршрутизации, чтобы сделать это сам, но мой фрилансер по делу. Если он придумает решение, я опубликую его. Я по-прежнему буду признателен за любые другие входные или альтернативные решения.
Обновление 3
Теперь решено! Обратите внимание, что это не было связано с MVC, это была красная селедка. Спасибо Грегу Бургхардту за то, что он указал мне в правильном направлении со своим комментарием: "По-видимому, IIS сначала пытается сопоставить виртуальный каталог, а затем контроллер MVC". Это правда, есть отсутствие проблем с маршрутизацией с наличием сайтов ASP.NET Web Forms в виртуальных каталогах на родительском сайте MVC. Это связано с проблемами наследования Entity Framework Web.config. Я отправлю ответ.
Ответы
Ответ 1
Наконец решил!
Ответ: да, прекрасно, что традиционные веб-формы ASP.NET в виртуальных каталогах находятся в родительском каталоге сайта MVC. Нет проблем с маршрутизации, поскольку IIS сначала ищет виртуальные каталоги, прежде чем смотреть на маршрутизацию MVC.
Проблема, с которой я столкнулась, связана с наследованием файла web.config. С новым сайтом MVC я впервые представил Entity Framework. Поэтому мой файл web.config содержит следующий раздел:
Parent MVC Web.config
<configSections>
<!-- various other sections ... -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
Теперь у моих дочерних сайтов веб-форм уже была одна и та же настройка, и оказывается, что не разрешено указывать больше, чем после иерархии. Я знаю о теге <location inheritInChildApplications="false">
, чтобы предотвратить наследование, но после экспериментов я обнаружил, что это нельзя использовать в разделе <configSections>
. Я также пробовал тег <clear />
в дочернем Web.config, но это, похоже, не работает в <configSections>
.
Итак, после выполнения этого ответа к аналогичной проблеме мне удалось решить эту проблему, комментируя различные разделы Entity Framework в моем дочернем Web.config и используя необычные привязка к исправлению ошибок (мой родительский сайт использовал версию 6, но мои дочерние сайты использовали версию 5).
Ребенок Web.config Релевантные фрагменты:
<configSection><entityFramework>
раздел прокомментирован:
<configSections>
<!--<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />-->
<entityFramework>
раздел прокомментирован:
<!--<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
</entityFramework>-->
Связывание во время выполнения, чтобы всегда использовать версию 5:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<!-- This is to get this Virtual Directory to use EF5 even if parent uses EF6 -->
<assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
Это немного беспорядочное решение, так как сайты моих дочерних веб-форм не являются all в виртуальном каталоге под родительским сайтом MVC, поэтому в этих случаях нужны разделы Entity Framework Web.config чтобы не комментировать. Если кто-нибудь знает более аккуратное решение, которое будет работать независимо от родительского сайта (или его отсутствия), пожалуйста, поделитесь им.
Ответ 2
Пожалуйста, попробуйте подход ниже, если я правильно задал вопрос.
Сама Visual Studio предоставляет возможность создания виртуальных каталогов и сопоставлений в IIS.
Пожалуйста, следуйте шагам 1 и шагу2, возможно, это поможет. Если у меня есть вопрос правильный.
![STEP 1]()
![enter image description here]()
- Выберите опцию "Веб" в левой панели.
- На центральном экране выберите опцию "LocalIIS" в раскрывающемся списке
- предоставить виртуальный путь для вашего приложения в текстовом поле как
- http://localhost/YourAppName 5. нажмите CreatevirtualDirectory