昨天,我更新了我的父母网站,成为一个asp.net MVC 5网络应用程序(由自由职业者为我开发).我只更新了父站点,它破坏了我的所有子站点.作为一个紧急修复,我已经在我的父MVC网站中重命名了web.config文件,显然这破坏了我的父站点,但至少客户端(子)站点正在再次工作.
在Webforms站点继承的根应用程序(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",id = UrlParameter.Optional } ); routes.MapRoute( name: "Default",url: "{controller}/{action}/{id}",id = UrlParameter.Optional } ); } }
我做了大量的搜索,但到目前为止还没有找到解决方案.所以我的问题是这样的:
>可以在MVC站点下的虚拟目录中有传统asp.net站点吗?
>如果是这样,我应该看什么设置?如何阻止子站点继承错误的设置?我有一种感觉,设置是在web.config或与上面的RouteConfig.cs有关的事情.
如果有任何人可以指出我正确的方向,我将非常感激,谢谢提前.
更新
还查看了这篇文章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实体框架继承问题.我会发布答案.
解决方法
答案是肯定的,在MVC网站父目录下的虚拟目录中传统的ASP.NET Web表单站点是非常好的.没有路由问题,因为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>
现在我的小孩网站表单网站已经有相同的设置了,结果是不允许更多地指定一次下一级.我知道< location inheritInChildApplications =“false”>标签,以防止继承,但经过实验,我发现这不能在< configSections>部分.我也尝试过< clear />标签在子Web.config,但这似乎不起作用< configSections>无论是.
所以,在跟着this answer出现类似的问题之后,我设法通过评论我的孩子Web.config中的各个实体框架部分来解决它,并使用异常绑定来修复版本问题(我的父站点使用版本6,但我的孩子网站使用版本5).
Child Web.config相关片段:
< configSection><&的EntityFramework GT;部分注释掉:
<configSections> <!--<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,Version=5.0.0.0,PublicKeyToken=b77a5c561934e089" requirePermission="false" />-->
<&的EntityFramework GT;部分注释掉:
<!--<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 Web表单网站并不都位于MVC父站点下的虚拟目录中,因此在这种情况下,Web.config的Entity Framework部分将需要被取消注释.如果任何人知道一个更完善的解决方案,那么无论父母网站(或缺乏)是否会有效,请分享.