IIS Express子应用程序配置继承

3

我正在尝试让一个包含WCF服务的MVC3应用程序作为子应用程序在IIS Express中正常工作。在IIS中它可以很好地运行,但在IIS Express中却出现了奇怪的情况。

当我在IIS中运行该站点时,来自子应用程序和父应用程序的配置设置都可以在子应用程序中使用。然而,当我在IIS Express中运行相同的代码时,只有父配置设置可用。

我找不到任何关于这是预期行为的文档。虽然这并不能排除这种可能性,但我倾向于认为我有配置问题。

问题是,我如何在不丢失子应用程序中应用的设置的情况下,在IIS Express中运行这些站点呢?

我使用的是Windows 7桌面版,Visual Studio 2010,MVC3和IIS Express 8。

这是我的applicationhost.config文件中的站点配置。

<site name="ParentMvcApp" id="7">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="c:\users\<username>\documents\visual studio 2010\Projects\ChildAppTest\ParentMvcApp" />
    </application>
    <application path="/Services/ChildWcfApp" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="c:\users\<username>\documents\visual studio 2010\Projects\ChildAppTest\ChildWcfApp" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:33888:localhost" />
    </bindings>
</site>

这里是MVC配置文件的内容。
<configuration>
  <appSettings>
    <add key="webpages:Version" value="1.0.0.0"/>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>

    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages"/>
      </namespaces>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IService1" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:33888/Services/ChildWcfApp/Service1.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
        name="BasicHttpBinding_IService1" />
    </client>
  </system.serviceModel>
</configuration>

以下是WCF服务配置文件的内容。
<?xml version="1.0"?>
<configuration>
    <appSettings>
        <add key="Test"
             value="Wtf"/>
    </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

我刚在一个新的Windows 7电脑上,使用全新安装的Visual Studio 2012运行了同样的项目,并得到了相同的结果。 - Sacrilege
1个回答

1
我终于找到了问题所在。我的子应用程序有两层深度。不幸的是,在这种情况下,IIS Express并不像完整版的IIS那样运作。即使它们被配置为应用程序,IIS Express也没有读取它们的配置文件。我必须显式地为具有allowSubDirConfig属性设置为true的父文件夹添加虚拟目录配置。
<virtualDirectory path="/Services" allowSubDirConfig="true" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接