Nei*_*eil 4 .net c# asp.net iis-7.5 asp.net-mvc-5
我有一个作为IIS网站创建的ASP.NET MVC5应用程序,具有自己的.NET 4.0 CLR应用程序池和位于以下位置的物理路径:
C:\Websites\XXX\Web\en-HK
Run Code Online (Sandbox Code Playgroud)
在此站点下,我在IIS(另一个MVC5应用程序)中有一个子应用程序“ zh”,再次具有其自己的.NET 4.0 CLR应用程序池和位于以下位置的物理路径:
C:\Websites\XXX\Web\zh-Hans-HK
Run Code Online (Sandbox Code Playgroud)
这两个站点都有自己的web.configs,子站点仅覆盖<appSetting>正在运行的单个站点。但是,不起作用的是父级元素似乎没有被继承下来。元素看起来像:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-5.2.0.0" newVersion="5.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.1.0.0" newVersion="2.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.2.0" newVersion="5.2.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.2.0" newVersion="5.2.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)
当我第一次在浏览器中运行子应用程序时,我看到一个YSOD抱怨找不到MVC 3.0-这是因为第3方DLL正在寻找MVC 3,但是没有重定向到5.2的绑定。
如果我将<runtime>元素粘贴到子web.config中,该错误就会消失。
是否<runtime>通过设计阻止了该元素在子应用程序中继承,或者我的设置已关闭?在machine.config中似乎没有受到保护。
更新
我认为问题与组装探测有关。
启用程序集加载跟踪后,我可以看到子应用程序中的YSOD是由ELMAH对MVC3的依赖性引起的,当.NET探测应用程序配置(我的子应用程序web.config)时,它找不到任何<assemblyBinding>信息,因此继续检查aspnet.config,而不是我的父站点web.config,它确实具有该<assemblyBinding>信息。

我猜这种行为是设计使然?
Asp.Net引擎将按照IIS层次结构的Web.config文件组合为最终配置源,.Net运行时将其用于特定网站中的请求
但是,该<runtime>部分有点特殊,因为它级别太低。托管代码不使用它,而是非托管.Net运行时主机使用它来定义其总体行为(程序集绑定是最常见的,但与GC相关的东西以及其他东西)