"externalizing" 某些配置设置进入外部文件时的行为不同

Behavior different when "externalizing" certain config settings into external files

我有一个遗留的 ASP.NET 4.0 Webforms 应用程序,它已经投入生产一段时间了。我现在以 WebAPI REST 服务的形式向其添加附加功能。

添加 WebAPI NuGet 包还在我的 web.config 配置 NewtonSoft.Json 包运行时版本中添加了一个条目:

现在,因为我有我的配置 "compartementalized",我想把它放到一个单独的 runtime.config 文件中并从主 web.config 中引用它:

<runtime configSource="runtime.config" />

当我这样做时,突然我在 global.asax.cs

中注册了 WebAPI 路由
protected void Application_Start(object sender, EventArgs e) 
{
    ...

    // Route #1
    GlobalConfiguration.Configuration.Routes.MapHttpRoute("Route1", "test/{list}/{check}", new { Controller = "Devices" });
    ...
}        

失败,异常:

System.IO.FileLoadException was unhandled by user code
Message=the file or assembly "Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" or a dependency could not be found. Source=System.Net.Http.Formatting
FileName=Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed

对我来说,外化的 runtime.config 似乎没有与 web.config 本身的内容同时被读取......这让我感到很惊讶,我原以为整个 web.config 包括任何 "externalized" 子配置文件将被读取 任何 global.asax.cs 中的代码被执行之前。 ..

有什么见解吗?我什至不知道去哪里搜索MSDN上这种级别的详细信息....

web.config 包含 Windows 网络堆栈的许多不同部分的配置信息。

它有些告诉 IIS 做什么,有些告诉 .NET 做什么,有些告诉应用程序做什么。因此,不同的元素的行为非常不同,具体取决于它们针对的是堆栈的哪一部分。

<runtime> 级别很低,参见 this from MSDN

"Runtime settings specify how the common language runtime handles garbage collection and the version of an assembly to use in configuration files."

configSource="whatever"其实是.NET自己解析的,see this from MSDN:

In ASP.NET applications, at run time you can assign to the ConfigSource property the name of an alternative configuration file.

所以基本上 .NET 是 运行,在解析 configSource.

之前具有指定的 <runtime> 设置

如果您在 Visual Studio 中使用 web.config 文件,您会看到智能感知会告诉您哪些属性可以放在哪里。