我有一个遗留的ASP.NET 4.0 Webforms应用程序已经生产了一段时间。我现在正以WebAPI REST服务的形式向其添加其他功能。
添加WebAPI NuGet包还在配置NewtonSoft.Json包运行时版本的web.config
中添加了一个条目:
现在,由于我的配置已“隔离”,我想将其放入单独的runtime.config
文件中并从主web.config
引用它:
<runtime configSource="runtime.config" />
当我这样做时,突然我在global.asax.cs
protected void Application_Start(object sender, EventArgs e)
{
...
// Route #1
GlobalConfiguration.Configuration.Routes.MapHttpRoute("Route1", "test/{list}/{check}", new { Controller = "Devices" });
...
}
失败,但有例外:
System.IO.FileLoadException未被用户代码
处理 Message =文件或程序集“Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”或找不到依赖项。 来源= System.Net.Http.Formatting
FileName = Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed
对我来说,似乎外化的runtime.config
没有被web.config
本身的内容同时阅读......这对我来说相当令人惊讶,我我希望在 web.config
中的任何代码执行之前,将包含所有“外化”子配置文件的整个global.asax.cs
...
任何见解?我甚至不知道在MSDN上搜索这一级别的详细信息...
答案 0 :(得分:1)
web.config包含Windows Web堆栈的许多不同部分的配置信息。
其中一些告诉IIS要做什么,其中一些告诉.NET要做什么,其中一些告诉你的应用程序该做什么。因此,不同的元素表现得非常不同,这取决于它们所针对的堆栈部分。
<runtime>
的级别相当低,请参阅this from MSDN:
&#34;运行时设置指定公共语言运行库的处理方式 垃圾收集和要使用的程序集的版本 配置文件。&#34;
configSource="whatever"
实际上是由.NET本身解析的,see this from MSDN:
在ASP.NET应用程序中,您可以在运行时分配给 ConfigSource属性是备用配置文件的名称。
因此,基本上.NET会使用指定的<runtime>
设置运行,然后才能解析configSource
。
如果你在Visual Studio中使用web.config文件,你会发现intellisense会告诉你哪些属性可以去哪里。