Доступ к настройкам 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.