将某些配置设置“外部化”到外部文件时行为不同

时间:2015-08-19 07:26:33

标签: c# asp.net-web-api webforms web-config asp.net-4.0

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

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

                                            

现在,由于我的配置已“隔离”,我想将其放入单独的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未被用户代码
处理   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上搜索这一级别的详细信息...

1 个答案:

答案 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会告诉你哪些属性可以去哪里。