为什么在使用自定义部分时必须在我的 app.config 中指定程序集而不是在我的 web.config 中指定程序集

Why do I have to specify the assembly in my app.config but not for my web.config when using custom sections

我的项目中有自定义部分。以下行适用于 web.config 中我的 Web API 项目:

...
  <sectionGroup name="Project.Models">
    <section name="product" type="Project.Models.Configuration.ProductSettings" />
  </sectionGroup>
</configSections>  
<Project.Models>
   <product id="1" />    
</Project.Models>

当我 运行 我的单元测试时,出现以下错误:

System.Configuration.ConfigurationErrorsException : An error occurred creating the configuration section handler for Project.Models/product: Could not load type 'Project.Models.Configuration.ProductSettings' from assembly 'System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Could not load type 'Project.Models.Configuration.ProductSettings' from assembly 'System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

为什么在我的单元测试中引用它时必须指定程序集名称 app.config?这解决了问题,但不确定为什么需要它。

<section name="product" type="Project.Models.Configuration.ProductSettings, Project.Models" />

这取决于执行您的代码的主机。

如果没有额外的管道,您会发现在 Configuration 命名空间的内部工作中,type 属性被馈送到静态方法 Type.GetType(string typeName) 中。

对于 typeName 参数,您可以在其描述中找到:

If the type is in the currently executing assembly or in Mscorlib.dll, it is sufficient to supply the type name qualified by its namespace.

关键部分是当前正在执行的程序集normal appdomains 似乎从来都不是这种情况,因此对于运行单元测试的应用程序(我假设是 VS)。

另一方面,ASP.NET 虚拟主机提供了一个内部 HttpConfigurationSystem class,它重新实现了对 GetSection 的调用。这有点难以理解,但它看起来像一个内部 class BuildManager 加载所有程序集并遍历所有类型,以找到匹配的。

这解释了行为上的差异。建议始终指定程序集名称。在 asp.net 场景中,如果 assemblyname 出现在类型参数中,它会短路到 Type.GetType 调用,这会阻止加载和检查 webapp 的 bin 文件夹中的所有 dll。