Доступ к настройкам Web.config в приложении Asp.Net Core?

Я понимаю, что ядро asp.net имеет новую конфигурационную систему, которая довольно гибкая и великолепная. Но есть вещи, которые мне нравятся в системе конфигурации на основе web.config из.net 4.x. Например, можно помещать комментарии в файл web.config, так как это xml файл. И это для меня стоит придерживаться xml, а не идти с блестящим новым подходом json. [ Обновление: теперь я понимаю, что подход json также поддерживает комментарии в файле.]

Итак, если у меня есть базовый веб-проект Asp.Net, который нацелен на полную структуру, мне кажется, что я должен использовать подход System.Configuration.ConfigurationManager.AppSettings[key] для получения настройки.

Но когда я пытаюсь, значение всегда возвращается null (по крайней мере, с помощью IIS express, использующего VS2015).

Он должен работать правильно? Какие-нибудь мысли о том, что я могу смотреть?

Web.config

<configuration>
    <appSettings>
        <add key="SomeSetting" value="true"/>
    </appSettings>

    <system.webServer>
        <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
        </handlers>

        <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
     </system.webServer>
</configuration>

Код для доступа к настройке:

string key = "SomeSetting";
string setting = ConfigurationManager.AppSettings[key];
if (setting == null)
       throw new Exception("The required configuration key " + key + " is missing. ");

ОБНОВИТЬ
После дальнейших исследований я теперь понимаю, почему это не работает, но я до сих пор не нашел способа исправить это. Коренной причиной является то, что ConfigurationManager ищет информацию о конфигурации в другом файле, а не в файле web.config.

Это можно увидеть, посмотрев свойство AppDomain.CurrentDomain.SetupInformation.ConfigurationFile. В моем случае вместо того, чтобы указывать на website_folder\web.config он вместо этого указывает на website_folder\bin\Debug\net461\win7-x64\wwwGiftOasisResponsive.exe.Config где site_folder - это путь к папке, содержащей мой сайт.

Документация и intellisense говорят, что AppDomain.CurrentDomain.SetupInformation.ConfigurationFile является настраиваемым свойством, но когда я пытаюсь, я нахожу, что этот параметр не меняет его значение. Очень странно.

Поэтому, хотя теперь я вижу, в чем проблема, я не могу найти способ ее исправить.

Ответ 1

Я нашел решение. Ключом к выяснению этого было понимание того, что свойство AppDomain.CurrentDomain.SetupInformation.ConfigurationFile не указывало на файл web.config, а скорее на файл exe.config для исполняемого файла, запускающего веб-сайт. Помните, что под ядром.net веб-сайт работает в своем собственном процессе и имеет свой собственный exe.

Таким образом, модель конфигурации, которую использует.Net 4.x с ConfigurationManager, больше похожа на конфигурацию настольного приложения, чем веб-приложение 4.x. Под этим я подразумеваю, что он смотрит на exe.config не на web.config.

Затем я заметил, что базовый веб-проект Asp.Net (с использованием полного фреймворка) содержит файл app.config, похожий на настольное приложение. И получается, что если вы поместите свои настройки конфигурации приложения.net 4.x в этот файл, они будут помещены в файл exe.config при генерации exe, будь то для отладки или для выпуска. Точно так же, как это работает с приложением win forms, например.

Таким образом, способ использования ConfigurationManager в основном веб-приложении asp.net, предназначенном для полной структуры, - это установить параметр приложения в файл app.config, а не файл web.config. ConfigurationManager не обнаружит их проблем.

enter image description here

Хотя это объясняет многое, он по-прежнему не обеспечивает возможность фактического размещения этих параметров в файле web.config и доступа к ним через ConfigurationManager. Но я начинаю полагать, что это невозможно в базовом веб-приложении asp.net, даже если оно нацелено на полную структуру.

Ответ 2

Я столкнулся с этой проблемой, когда начал публиковать приложение asp.net core 1.1 для IIS.
В IIS будет создан файл web.config, который был бы перезаписан при публикации. Чтобы включить аутентификацию Windows, мне пришлось добавить web.config вручную в мой проект. Это правильно опубликовано в IIS:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\yourproject.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <security>
      <authentication>
        <anonymousAuthentication enabled="false" />
        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</configuration>

Ответ 3

Я также столкнулся с этой проблемой. После некоторого исследования и прочтения этого файла вы можете добавить web.config вручную, но это для установки параметров IIS (например, Аутентификация,...).

Для настроек приложения или пользовательских настроек вам необходимо работать с файлом appsettings.json и новой конфигурацией в .Net Core.

Документация по Microsoft

Ответ 4

Наше веб-приложение ASP.NET Core развернуто в общей среде IIS. В одном и том же IIS есть другие приложения, которые используют классический ASP.NET и полностью полагаются на всю иерархию web.config/machine.config.

ИТ-команда, которая управляет серверами, управляет конфигурационными файлами на уровне машины для некоторых значений конфигурации ключа. Поскольку веб-приложение ASP.NET Core в IIS опирается на модель app.config, оно не может считывать значения из централизованного web.config(он может читать из machine.config). Мне нужно прочитать несколько ключей с уровня web4.config Framework64 в моем приложении IIS для ASP.NET Core для .NET 4.6.2. Есть ли способ сделать это, не копируя настройки в локальные файлы.