Обновить web.config на основе другого сервера, используя asp.net

Я ищу простой и элегантный способ изменить свой appsettings в web.config на основе другой среды, и у меня есть (dev/qa/test/stage/prod), и я вручную меняю appsettings и его очень утомительное и трудоемкое время, и у меня есть десятки настроек... Каков наилучший подход для этой любопытной ситуации? Я знаю одно решение, используя Environment variables, но хочет услышать наилучшую практику?

8 ответов

Я предпочитаю использовать внешние разделы web.config, например:

то appsettings.config выглядит так:

<appsettings> </appsettings>

Это позволяет мне сохранять настройки приложения в отдельном файле, который не изменяется, но при этом позволяет редактировать основной web.config для фактических частей конфигурации. Вы можете сделать то же самое в других разделах - строки подключения, system.net(для электронной почты) и т.д.

На самом деле я не думаю, что VS2010 очень хорош, так как он требует повторной сборки только для изменения конфигурации. По моему способу, это можно использовать без VS вообще, поэтому я могу легко изменить все свои среды вручную.


Если возможно, обновите приложение до asp.net 4.

В этой версии есть функция преобразования web.config, предназначенная для решения именно этой проблемы:


До VS2010 мы фактически назвали ours web.prod.config, web.qa.config и т.д. Я думаю, у нас была отличная дальновидность.

В любом случае в VS2008 у нас была команда копирования, которая была выполнена как часть шага сборки, скопировала соответствующий файл конфигурации на основе конфигурации, которую мы строили. Наш обычный web.config указал на dev, и мы использовали TFS для развертывания в других средах.


В конечном счете, я рекомендую использовать возможность преобразования Web.config в Visual Studio 2010, если это возможно.

Если VS2010 не является опцией или вы не хотите использовать функцию преобразования конфигурации, взгляните на это решение, которое я придумал некоторое время назад. Он использует комбинацию пакетного файла и NANT script для создания файлов конфигурации из одного шаблона и одного или нескольких файлов замещения. Это не так сильно, как инструмент преобразования Web.config, но это довольно эффективная альтернатива.

http://blog.nathan-taylor.net/2009/10/webconfig-build-manager.html


Я обычно делаю следующее:

  • Включить несколько версий каждого значения конфигурации, по одному для каждой среды.
  • Сделайте небольшой класс для чтения настроек моего приложения. В этом классе создайте функцию, которая обнаруживает текущую среду.
  • Для каждого параметра создайте свойство accessor, у которого есть переключатель, который использует функцию обнаружения среды для определения возвращаемого значения.

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


Если вы используете VS2010 (NET tools version 4), вы можете делать преобразования веб-конфигурации и создавать пакет развертывания для развертывания в стадии постановки, производства и т.д. Не имеет значения, какова ваша целевая версия asp.net. Затем разверните пакет и tada, у вас будет настроенный файл конфигурации, установленный на вашей цели. Нет необходимости во время выполнения, чтобы понять это. Я все время использую 3.5 в качестве моей целевой версии .NET с использованием MSBuild 4, который использует VS2010. В моей среде разработки есть разные настройки приложения, чем в моей рабочей и промежуточной среде.


Мы используем Nant для script наших сборок и развертываний.

Nant скопирует шаблоны web.config и app.config в те места, где ожидаются файлы проекта. В то же время Нант заменяет токены соответствующими значениями для среды QA.


Я знаю, что вы уже приняли ответ, но я использую метод создания разных файлов конфигурации в соответствии с разными средами и назван как таковой.

Например, у меня есть appsettings.config.debug, appsettings.config.deploy, web.config.debug, web.config.deploy.

Затем у меня есть предварительная сборка script, которая запускает пакетный файл, который копирует конфигурационный файл, связанный с моим текущим параметром конфигурации, в файл без суффикса настроек конфигурации. Это делается только в том случае, если файлы отличаются от FC.

Код командной строки события pre-build:

"$(ProjectDir)copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config"

и

"$(ProjectDir)copyifnewer.bat" "$(ProjectDir)appsettings.config.$(ConfigurationName)" "$(ProjectDir)appsettings.config"

И мой файл copyifnewer.bat:

echo Config Maintenance
echo Today date of %date:~-4,4%\%date:~-10,2%\%date:~-7,2%
rem echo Comparing two files: %1 with %2
echo .
if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound
fc %1 %2
if %ERRORLEVEL%==0 GOTO NoCopy
echo These files are NOT the same. Copying %1 over %2
copy %1 %2 /y & goto END
:NoCopy
echo These files are the same. Nothing copied.
goto END
:File1NotFound
echo %1 not found.
goto END
:File2NotFound
copy %1 %2 /y
goto END
:END
echo Done.
echo .

Это отлично работает для меня. Надеюсь, это поможет кому-то.

Спасибо, Скотт

licensed under cc by-sa 3.0 with attribution.