Использование различных Web.config в среде разработки и производства

194

Мне нужно использовать разные строки подключения к базе данных и адрес SMTP-сервера в моем приложении ASP.NET в зависимости от того, запущено ли оно в среде разработки или производства.

Приложение считывает настройки из файла Web.config через свойство WebConfigurationManager.AppSettings .

Я использую команду Build / Publish для развертывания приложения на рабочем сервере через FTP, а затем вручную заменяю удаленный Web.config на правильный.

Можно ли как-то упростить процесс развертывания? Спасибо!

Александр Прокофьев
источник

Ответы:

159

В Visual Studio 2010 и более поздних версиях у вас теперь есть возможность применить преобразование к вашему web.config в зависимости от конфигурации сборки.

При создании файла web.config вы можете развернуть файл в обозревателе решений и увидите два файла:

  • Web.Debug.Config
  • Web.Release.Config

Они содержат код преобразования, который можно использовать для

  • Изменить строку подключения
  • Удалить трассировку отладки и настройки
  • Зарегистрируйте страницы ошибок

Дополнительные сведения см. В разделе Синтаксис преобразования Web.config для развертывания проекта веб-приложения на MSDN.

Также возможно, хотя официально и не поддерживается, применить такой же тип преобразования к app.configфайлу, не являющемуся веб-приложением . См. Блог Фила Болдука о том, как изменить файл проекта, чтобы добавить новое задание в msbuild.

Это длинный выдержанный запрос на Visual Studio Uservoice .

Доступно расширение для Visual Studio 2010 и выше « SlowCheetah », позволяющее создавать преобразования для любого файла конфигурации. Начиная с Visual Studio 2017.3, SlowCheetah был интегрирован в IDE, а база кода находится под управлением Microsoft. Эта новая версия также поддерживает преобразование JSON.

Пьер-Ален Вижан
источник
7
Обратите внимание, что это не работает для старых проектов веб- сайта . Только для веб- приложений . Я не пытался проверить, подходит ли обходной путь Фила Болдука для веб-сайтов, но я подозреваю, что это не так, поскольку у них нет файлов проекта.
мес.
13
Также обратите внимание, что преобразования web.confg работают только для ПУБЛИКАЦИИ, они не будут работать, если вы просто соберете / запустите F5: ((((
Alex
7
Если ваш web.config не содержит Web.Debug.Configи Web.Release.Config, вам может потребоваться щелкнуть правой кнопкой мыши Web.Configи щелкнуть Add Config Transforms.
Дуг С
1
@ Алекс: как мы можем использовать его для простой сборки / F5?
игрок
1
прямая ссылка на SlowCheetah: marketplace.visualstudio.com/…
Xiao
83

<appSettings>Тег в web.config поддерживает атрибут файла , который будет загружать внешний конфиг с его собственным набором ключевых / значений. Они переопределят любые настройки, которые есть в вашем файле web.config, или добавят к ним.

Мы используем это, изменяя наш web.config во время установки с помощью атрибута файла, который соответствует среде, в которую устанавливается сайт. Мы делаем это с помощью нашего установщика.

например;

<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">

<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">

Примечание:

  • Изменения в файле .config, заданном атрибутом, не приведут к перезапуску рабочего процесса asp.net.
Джейсон Слокомб
источник
2
Это отличный ответ, особенно если у вас большое количество сред и некоторые настройки для некоторых сред имеют пароли и тому подобное, которые вы не хотите отслеживать в системе контроля версий.
Фил
1
Есть ли динамический способ изменения пути к файлу? На каком сервере вы находитесь? Еще одно замечание: это работает над старым проектом сайта, а не над веб-приложением. Так что спасибо тебе!
Перспектива
2
Существует атрибут, restartOnExternalChangesкоторый будет обрабатывать эти файлы, как если бы они были web.configs. Источник: learnable.com/books/…
Дэвид Шварц
24

Вы смотрели на проекты веб-развертывания?

http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en

Также есть версия для VS2005, если вы не на 2008.

wulimaster
источник
Это хорошее руководство по использованию проектов веб-развертывания: johnnycoder.com/blog/2010/01/07/…
Гэри У
Проекты веб-развертывания выглядят как VS "Publishing Profiles", теперь diaryofaninja.com/blog/2012/08/26/…
jocull
13

Я тоже хотел бы знать. Это помогает изолировать проблему для меня

<connectionStrings configSource = "connectionStrings.config" />

Затем я сохраняю connectionStrings.config, а также "{host} connectionStrings.config". Это все еще проблема, но если вы сделаете это для разделов, которые различаются в двух средах, вы можете развернуть и установить версию того же web.config.

(И я не использую VS, кстати.)

Харпо
источник
Если вы используете VS, вы можете использовать prebuild-events для копирования из debug.connectionstrings.config или release.connectionstrings.config, например: copy $ (ProjectDir) $ (ConfigurationName) ConnectionStrings.config $ (ProjectDir) ConnectionStrings.config, как предлагается Скотт. Hanselmann: hanselman.com/blog/...
Томас
6

Я использую скрипт сборки NAnt для развертывания в разных средах. Он изменяет мои файлы конфигурации через XPath в зависимости от того, где они развернуты, а затем автоматически помещает их в эту среду с помощью Beyond Compare .

Установка занимает минуту или две, но вам нужно сделать это только один раз. Тогда пакетные файлы вступают во владение, в то время как я иду, чтобы получить другую чашку кофе. :)

Вот статья, которую я нашел на ней.

Джефф Шелдон
источник
5

В одном проекте, где у нас было 4 среды (разработка, тестирование, подготовка и производство), мы разработали систему, в которой приложение выбирало соответствующую конфигурацию на основе имени компьютера, на котором оно было развернуто.

Это сработало для нас, потому что:

  • администраторы могут развертывать приложения без привлечения разработчиков (требование) и без необходимости возиться с файлами конфигурации (которые они ненавидят);
  • имена машин придерживались соглашения. Мы сопоставляли имена с помощью регулярного выражения и развертывали на нескольких машинах в среде; и
  • мы использовали встроенную защиту для строк подключения. Это означает, что мы могли бы хранить имена учетных записей в наших конфигурационных файлах во время разработки, не раскрывая никаких паролей.

В данном случае это хорошо сработало, но, вероятно, не сработало бы везде.

dariom
источник
3

Редактор конфигурации Enterprise Library может помочь вам в этом. Это позволяет вам создать базовый конфигурационный файл и затем дельты для каждой среды. Затем вы можете объединить базовую конфигурацию и дельту для создания специфичного для среды web.config. Взгляните на ту информацию здесь , который довезет вас через это лучше , чем я могу.

PhilPursglove
источник
3

Вы также можете сделать это после сборки. Установите новую конфигурацию «Развертывание» в дополнение к «Отладке и выпуску», а затем скопируйте на шаг после сборки правильный файл web.config.

Мы используем автоматические сборки для всех наших проектов, и вместе с ними скрипт сборки обновляет файл web.config, чтобы указать правильное местоположение. Но это не поможет вам, если вы делаете все из VS.

Кори Фой
источник
3

Это одно из огромных преимуществ использования machine.config. На моей последней работе у нас были среды разработки, тестирования и производства. Мы могли бы использовать machine.config для таких вещей, как строки подключения (к соответствующей машине dev / test / prod SQL).

Это может не быть решением для вас, если у вас нет доступа к реальной рабочей машине (например, если вы использовали хостинговую компанию на общем хосте).

Тимоти Хоури
источник
1

Вы также можете использовать расширение «Преобразование конфигурации» работает так же, как «SlowCheetah»,

Парт Кале
источник
да, это работает, но только при развертывании, а не при компиляции, я хотел бы просто скомпилировать и отладить, используя различные среды преобразования конфигурации
Ch'nycos