ConfigurationManager行为不一致

时间:2019-06-20 22:29:21

标签: c# asp.net asp.net-mvc wpf

我已经了解了使用ConfigurationManager进行的自定义配置。由于某些原因,您必须在app.config的section元素中使用程序集引用,否则ConfigurationManager不会加载app.config。但是在ASP.NET应用程序中,这种方法可以正常工作。为什么?

请考虑以下自定义配置类:

namespace CustomConfiguration
{
    class MySection : ConfigurationSection
    {
        [ConfigurationProperty("link", IsKey = true)]
        public string Link
        {
            get => (string) this["link"];
            set => this["link"] = value;
        }
    }
}

使用此app.config,我可以在程序中轻松获取myCustomSection的链接属性:

<configuration>
  <configSections>
    <section name="myCustomSection" type="CustomConfiguration.MySection, myAssembly" />
  </configSections>

  ...

  <myCustomSection link="link i can access in my code" >
  </myCustomSection>


</configuration>

在app.config的section-element中删除程序集引用将导致ConfigurationErrorsException,因为ConfigurationManager无法在其自己的System.Configuration程序集中加载我的CustomConfiguration.MySection类。 例如:

<section name="myCustomSection" type="CustomConfiguration.MySection" />

但是Microsofts documentation说我应该可以做到。 实际上,我可以在ASP.NET应用程序中执行此操作。在节的type属性中不提供程序集名称仍然可行,并且system.configuration在正确的应用程序程序集中看起来很神奇。为什么?

1 个答案:

答案 0 :(得分:0)

ASP.NET托管环境具有不同的程序集加载行为;
它会在启动时加载所有引用的程序集(从binGAC开始)。
因此,CustomConfiguration.MySection节的汇编可以自动解决,而无需在type定义中指定。

如果您在web.config文件中包含以下设置,则程序集myAssembly将在初次启动时不再加载。
然后,还需要通过typeCustomConfiguration.MySection, myAssembly定义中指定装配零件。在这里,您将获得与非基于Web的应用程序相同的行为。

<configuration>
    <!-- ... -->
    <system.web>    
        <compilation>           
          <assemblies>
              <remove assembly="myAssembly" />
          </assemblies>
        </compilation>
    </system.web>
    <!-- ... -->
</configuration>

您问题中的referenced documentation显示可以在app.config文件(非基于Web的应用程序)中声明一个部分(如下所示),但这仅适用于外部盒子提供的配置类/处理程序,例如System.Configuration.SingleTagSectionHandler,位于核心System组件(System.dll)中。
对于所有其他(自定义)部分,需要完整的程序集名称。

<configuration>
   <configSections>
      <section name="sampleSection"
               type="System.Configuration.SingleTagSectionHandler" />
   </configSections>

   <sampleSection setting1="Value1" 
                  setting2="value two" 
                  setting3="third value" />
</configuration>