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

时间:2015-06-12 09:55:41

标签: c# asp.net .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网络应用程序(由自由职业者为我开发)。我只更新了父网站,它打破了我所有的子网站。作为紧急修复,我已经在我的父MVC站点中重命名了web.config文件,显然这已经破坏了我的父站点,但至少客户端(子站点)网站​​再次正常运行。

在根应用程序(MVC one)中显然有一个设置,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. 是否可以在MVC网站下的虚拟目录中安装传统的asp.net站点?
  2. 如果是这样,我应该查看哪些设置?如何阻止子站点继承错误的设置?我感觉设置在web.config中或与上面的RouteConfig.cs有关。
  3. 如果有人能指出我正确的方向,我将非常感激,提前谢谢。

    更新

    还看过这篇文章Virtual Directory App within a Asp.net MVC app我尝试在根应用程序中编辑web.config并将<location inheritInChildApplications="false">包装在允许它的所有内容周围。但它不起作用,客户端网站仍然无法正常工作。

    更新2

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

    就我个人而言,我对路由自己不了解,但我的自由撰稿人就是这样。如果他想出一个解决方案,我会发布它。我仍然会感谢任何其他输入或替代解决方案。

    更新3

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

2 个答案:

答案 0 :(得分:1)

终于解决了!

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

我原来遇到的问题与web.config文件继承有关。通过新的MVC站点,我第一次引入了Entity Framework。所以我的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>

现在,我的子网站表单网站已经具有相同的设置,并且事实证明,在层次结构之后不允许更多地指定它们。我知道<location inheritInChildApplications="false">标记可以阻止继承,但经过实验,我发现这不能在<configSections>部分使用。我还尝试了子Web.config中的<clear />标记,但这似乎也不适用于<configSections>

因此,在关注this answer类似问题之后,我设法通过在我的孩子Web.config中注释掉各种Entity Framework部分来解决它,并使用异常绑定来修复版本问题(我的父站点是使用版本6,但我的子站点使用的是版本5)。

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

这是一个混乱的解决方案,因为我的Child网站表单网站不是所有在MVC父网站下面的虚拟目录中,因此在这些情况下,Web.config的实体框架部分需要没有评论。如果有人知道更简洁的解决方案,无论父网站(或缺少网站)都可以使用,请分享。

答案 1 :(得分:0)

如果我正确地得到了问题,请尝试以下方法。 Visual Studio本身提供了一个创建虚拟目录和映射到IIS的选项。

请按照步骤1和步骤2进行操作,如果我的问题正确,可能会有所帮助。

STEP 1 enter image description here

  1. 选择选项&#34; Web&#34;在左侧面板
  2. 在中央屏幕上,选择&#34; LocalIIS&#34; Dropdownlist中的选项
  3. 在文本框中为您提供虚拟路径
  4. http://localhost/YourAppName 5.单击CreatevirtualDirectory