Поведение отличается при переносе определенных параметров конфигурации во внешние файлы.

У меня есть устаревшее приложение ASP.NET 4.0 Webforms, которое уже некоторое время находится в производстве. Сейчас я добавляю к нему дополнительную функциональность в виде службы WebAPI REST.

Добавление пакетов WebAPI NuGet также добавило запись в мою web.config настройку версии среды выполнения пакета NewtonSoft.Json:

Теперь, поскольку моя конфигурация «разделена», я хотел поместить ее в отдельный файл runtime.config и ссылаться на нее из основного файла web.config:

<runtime configSource="runtime.config" />

Когда я это делаю, вдруг моя регистрация маршрутов WebAPI в 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 не было обработано кодом пользователя
Сообщение = файл или сборка "Newtonsoft.Json, версия = 4.5.0.0, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed" или зависимость не найдена. Source=System.Net.Http.Formatting
FileName=Newtonsoft.Json, версия=4.5.0.0, культура=нейтральная, PublicKeyToken=30ad4fe6b2a6aeed

Мне кажется, что внешнее runtime.config не читается одновременно с содержимым самого web.config......, что для меня довольно удивительно, я ожидал, что весь web.config, включая любые "внешние " файлы подконфигурации будут считаны до выполнения любого кода в global.asax.cs...

Любые идеи? Я даже не знаю, где искать такой уровень подробной информации в MSDN....


person marc_s    schedule 19.08.2015    source источник
comment
Похоже, вы не первый - world.episerver.com/Blogs/Magnus-Rahl/Dates/2011/6/ и социальный. msdn.microsoft.com/Forums/vstudio/en-US/. Не уверен, если/где это освещалось в MSDN.   -  person Alexei Levenkov    schedule 19.08.2015
comment
@AlexeiLevenkov: если вы добавите это в качестве ответа, я с радостью приму его :-)   -  person marc_s    schedule 20.08.2015


Ответы (1)


web.config содержит информацию о конфигурации для множества различных частей веб-стека Windows.

Некоторые из них говорят IIS, что делать, некоторые — .NET, что делать, некоторые — вашему приложению, что делать. Таким образом, разные элементы ведут себя по-разному в зависимости от того, на какую часть стека они нацелены.

<runtime> довольно низкий уровень, см. это из MSDN:

«Параметры среды выполнения определяют, как общеязыковая среда выполнения обрабатывает сборку мусора и версию сборки для использования в файлах конфигурации».

configSource="whatever" фактически анализируется самой .NET, см. это из MSDN:

В приложениях ASP.NET во время выполнения вы можете назначить свойству ConfigSource имя альтернативного файла конфигурации.

Таким образом, в основном .NET запускается с указанными настройками <runtime>, прежде чем он будет анализировать configSource.

Если вы поиграете с файлом web.config в Visual Studio, вы увидите, что IntelliSense сообщит вам, какие атрибуты могут быть использованы.

person Jason Elkin    schedule 09.09.2015