我可以在MVC站点下的虚拟目录中使用传统的ASP.NET Web应用程序吗?

Joa*_*ton 10 .net c# asp.net asp.net-mvc asp.net-mvc-5

这是多年来一直在努力的情景.我在(比如)www.MySite.co.uk上有一个父asp.net Web应用程序,在它下面我有多个虚拟目录中的子(客户)站点,例如www.MySite.co.uk/Client1等.所有站点(父站点)和子虚拟目录)是使用.NET 4.5的传统asp.net Web表单应用程序,一切正常.

昨天,我将我的父网站更新为asp.net MVC 5 Web应用程序(由自由职业者为我开发).我只更新了父网站,它打破了我所有的子网站.作为紧急修复,我已经在我的父MVC站点中重命名了web.config文件,显然这已经破坏了我的父站点,但至少客户端(子站点)网站​​再次运行.

在根应用程序(MVC之一)中显然有一个设置,webforms网站正在继承它们并且它们不喜欢它.

在我的研究中,我遇到了这个:http://forums.iis.net/t/1200821.aspx?创建+virtual+directory+for+ASP+NET+website+under+MVC+应用程序,所以我想知道是否设置问题是我的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 }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我做了很多搜索,但到目前为止一直无法找到解决方案.所以我的问题是:

  1. 是否有可能在MVC网站下的虚拟目录中拥有传统的asp.net站点?
  2. 如果是这样,我应该看什么设置?如何阻止子站点继承错误的设置?我有一种感觉,设置要么在web.config中,要么与上面的RouteConfig.cs有关.

如果有人能指出我正确的方向,我将非常感激,谢谢你提前.

更新

我还在Asp.net MVC应用程序中查看了这篇文章的虚拟目录应用程序,我尝试在根应用程序中编辑web.config并包装 <location inheritInChildApplications="false">允许它的所有内容.但它没有用,客户端网站仍然无法正常工作.

更新2

我收到了我的自由职业者的回复,他说这是关于路由和URL的,因为MVC期望在/ Client1等等.因此我们需要编写一个路由,将这些请求(路由加一个字)发送到控制器,然后需要看看这是MVC中的页面(例如/ help)还是客户端站点(例如/ Client1)并显示适当的页面.

就个人而言,我自己也不太了解路由这样做,但我的自由职业者就是这个案子.如果他想出一个解决方案,我会发布它.我仍然会感谢任何其他输入或替代解决方案.

更新3

现在解决了!请注意,这与MVC无关,那是一个红鲱鱼.感谢Greg Burghardt指出我正确的方向,他的评论是"显然IIS首先尝试匹配虚拟目录,然后是MVC控制器".确实如此,在MVC父站点下的虚拟目录中使用ASP.NET Web窗体站点没有路由问题.这与web.config实体框架继承问题有关.我会发布答案.

Joa*_*ton 1

终于解决了!

答案是肯定的,将传统的 ASP.NET Web 表单站点放在 MVC 站点父目录下的虚拟目录中是完全可以的。不存在路由问题,因为 IIS 在查看 MVC 路由之前首先查找虚拟目录。

我发现问题与 web.config 文件继承有关。在新的 MVC 站点中,我第一次引入了实体框架。所以我的 web.config 文件包含以下部分:

父 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>
Run Code Online (Sandbox Code Playgroud)

现在,我的子 Web 表单网站已经具有相同的设置,而且事实证明,除了在层次结构中向下指定之外,不允许再指定更多内容。我知道<location inheritInChildApplications="false">防止继承的标签,但经过实验,我发现这不能在该<configSections>部分上使用。我还尝试了<clear />子 Web.config 中的标签,但这似乎在任何一个中都不起作用<configSections>

因此,在遵循类似问题的答案后,我设法通过注释掉我的子 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" />-->
Run Code Online (Sandbox Code Playgroud)

<entityFramework>部分注释掉:

<!--<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>-->
Run Code Online (Sandbox Code Playgroud)

在运行时部分绑定以始终使用版本 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>
Run Code Online (Sandbox Code Playgroud)

这是一个有点混乱的解决方案,因为我的子 Web 表单站点并不全部位于MVC 父站点下的虚拟目录中,因此在这些情况下,需要取消注释 Web.config 的实体框架部分。如果有人知道更简洁的解决方案,无论父站点(或缺少父站点)如何,该解决方案都可以工作,请分享。