Могу ли я иметь традиционные веб-приложения 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 1enter image description here

  • Выберите опцию "Веб" в левой панели.
  • На центральном экране выберите опцию "LocalIIS" в раскрывающемся списке
  • предоставить виртуальный путь для вашего приложения в текстовом поле как
  • http://localhost/YourAppName 5. нажмите CreatevirtualDirectory