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

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

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

Но когда я пытаюсь, значение всегда возвращается ноль (по крайней мере, с 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 где website_folder - это путь к папке, содержащей мой сайт.

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

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

3 ответа

Решение

Я вроде нашел решение. Ключом к пониманию этого было понимание того, что 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 Form.

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

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

Я столкнулся с этой проблемой, когда начал публиковать свое приложение 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>

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

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

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

Другие вопросы по тегам