Могу я иметь традиционное ASP.NET веб-приложения в виртуальных каталогах под сайтом MVC?

это сценарий, который работает в течение многих лет. У меня есть родитель. asp.net веб-приложение на (скажем) www.MySite.co.uk и под ним у меня есть несколько дочерних (клиентских) сайтов в виртуальных каталогах, например www.MySite.co.uk/Client1 etc. Все сайты (родительские и дочерние виртуальные каталоги) являются традиционными asp.net веб-формы приложений с использованием .NET 4.5 и все работает нормально.

вчера я обновил свой родительский сайт, чтобы быть asp.net веб-приложение MVC 5 (разработано для меня фрилансер.) Я только обновил Родительский сайт, и он сломал все мои дочерние сайты. В качестве экстренного исправления для этого я переименовал web.файл конфигурации на моем родительском сайте MVC, очевидно, это сломало мой родительский сайт, но, по крайней мере, клиентские (дочерние) сайты снова работают.

очевидно, что в корневом приложении (MVC) есть параметр, который наследуют сайты webforms, и им это не нравится.

в моем исследовании я наткнулся на это: 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 }
        );
    }
}

Я много искал, но до сих пор не смог найти решение. Итак, мой вопрос это:

  1. возможно ли иметь традиционные asp.net сайт в виртуальном каталоге под сайтом MVC?
  2. если да, то какие настройки я должен смотреть? Как я могу остановить дочерние сайты, наследующие неправильные настройки? У меня такое чувство, что настройки либо в интернете.config или что-то связанное с RouteConfig.cs выше.

Я был бы очень благодарен, если бы кто-нибудь мог указать мне в правильном направлении, Спасибо продвижение.

обновление

также посмотрев на этот пост виртуальный каталог приложение в a Asp.net MVC app я пробовал редактировать web.config в корневом приложении и wrapping <location inheritInChildApplications="false"> вокруг всего, что позволит это. Но это не сработало, клиентские сайты по-прежнему не работали.

обновление 2

у меня есть ответ от моего фрилансера, который говорит, что речь идет о маршрутизации и URL, потому что MVC ожидает что-то быть в /Client1 и т. д. Поэтому нам нужно написать маршрут, который отправляет такие запросы (маршрут плюс одно слово) контроллеру, который затем должен увидеть, является ли это страницей в MVC (например, /help) или клиентском сайте (например, /Client1) и отобразить соответствующую страницу.

лично я не знаю достаточно о маршрутизации, чтобы сделать это сам, но мой фрилансер-это по делу. Если он найдет решение, я его опубликую. Я все равно был бы признателен за любой другой вклад или альтернативу решения.

обновление 3

теперь решена! Обратите внимание, что это не имело никакого отношения к MVC, это была красная селедка. Спасибо Грегу Бургхардту за то, что указал мне в правильном направлении своим комментарием "по-видимому, IIS пытается сначала сопоставить виртуальный каталог, а затем контроллер MVC". Это правда, есть нет проблем с маршрутизацией С иметь ASP.NET сайты веб-форм в виртуальных каталогах родительского сайта MVC. Это было связано с вебом.объекта config Вопросы наследования рамок. Я опубликую ответ.

2 ответов


наконец-то решили!

ответ Да, совершенно отлично иметь традиционное ASP.NET сайты веб-форм в виртуальных каталогах в Родительском каталоге сайта MVC. Нет проблем с маршрутизацией, так как IIS сначала ищет виртуальные каталоги, прежде чем смотреть на маршрутизацию MVC.

проблема, с которой я столкнулся, была связана с web.наследование конфигурационного файла. С новым сайтом MVC я впервые представил Entity Framework. Так что моя паутина.конфигурационный файл содержался следующий раздел:

Родительский 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"> тег для предотвращения наследования, но после экспериментов я обнаружил, что это нельзя использовать на . Я также пробовал <clear /> тег в дочерней сети.config, но это кажется, не работает в <configSections> либо.

таким образом, после ответ к аналогичной проблеме мне удалось решить ее, комментируя различные разделы Entity Framework в моем дочернем Интернете.config и использовал необычную привязку, чтобы также исправить проблемы с версией (мой родительский сайт использовал версию 6, но мои дочерние сайты использовали версию 5).

Веб-Ребенок.config Соответствующие Фрагменты:

прокомментировал out:

<configSections>
<!--<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />-->

комментарии:

<!--<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>

это немного грязное решение, поскольку мои дочерние веб-сайты форм не все в виртуальном каталоге под родительским сайтом MVC, поэтому в этих случаях разделы Entity Framework в Интернете.config нужно будет не комментировать. Если кто-то знает более аккуратное решение, это будет работать независимо от Родительский сайт (или его отсутствие), пожалуйста, поделитесь.


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

пожалуйста, следуйте шагу 1 и шагу 2, может быть, это поможет, если у меня есть правильный вопрос.

STEP 1enter image description here

  1. выберите опцию " Web " в левой панели
  2. на центральном экране выберите опцию "LocalIIS" в раскрывающемся списке
  3. обеспечить Виртуальный путь для вас приложение в текстовом поле как
  4. http://localhost/YourAppName 5. нажмите CreatevirtualDirectory