Доступ к настройкам 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. Есть ли способ сделать это, не копируя настройки в локальные файлы.