Отладка / выпуск Web.Config

82

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

Вот мой Web.Release.config:

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Testing1" connectionString="Data Source=test;Initial Catalog=TestDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

</configuration>

Вот мой код Web.Debug.config:

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Live1" connectionString="Data Source=Live;Initial Catalog=LiveDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

</configuration>

А это мой код Web.config:

<?xml version="1.0"?>

<!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 -->
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
       <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

    <membership>
       <providers>
          <clear/>
          <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
       </providers>
    </membership>

    <profile>
       <providers>
          <clear/>
          <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
       </providers>
    </profile>

    <roleManager enabled="false">
       <providers>
          <clear/>
          <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
       </providers>
    </roleManager>

  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

Когда я публикую свой проект, в моем файле Web.config ничего не отображается. Не отображается строка подключения к моей базе данных Live?

РГ-3
источник

Ответы:

131

Преобразования web.config, являющиеся частью Visual Studio 2010, используют XSLT для «преобразования» текущего файла web.config в его версию .Debug или .Release.

В ваших файлах .Debug / .Release вам необходимо добавить следующий параметр в поля строки подключения:

xdt:Transform="SetAttributes" xdt:Locator="Match(name)"

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

Примечание. Вам не придется беспокоиться об обновлении параметра providerName в файлах преобразования, поскольку они не меняются.

Вот пример из одного из моих приложений. Вот раздел файла web.config:

<connectionStrings>
      <add name="EAF" connectionString="[Test Connection String]" />
</connectionString>

А вот секция web.config.release, выполняющая правильное преобразование:

<connectionStrings>
      <add name="EAF" connectionString="[Prod Connection String]"
           xdt:Transform="SetAttributes"
           xdt:Locator="Match(name)" />
</connectionStrings>

Одно добавленное примечание: преобразования происходят только при публикации сайта, а не при его простом запуске с помощью F5 или CTRL + F5. Если вам нужно запустить обновление для данной конфигурации локально, вам придется вручную изменить для этого файл Web.config.

Подробнее см. Документацию MSDN.

https://msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx

Дилли-О
источник
20
Можете ли вы добавить к ответу примечание, что это происходит во время публикации, а не во время F5? По-видимому, у меня это было правильно в течение 2 часов, но я этого не осознавал.
Пол
Как я могу заставить эту работу работать с Visual Studio Online Continuous Build? Я хочу, чтобы он преобразовал мой Web.Config во время сборки и развертывания в Azure.
Росди Касим
1
@RosdiKasim - я не уверен, что это будет соответствовать на 100% для Visual Studio онлайн, но когда мне нужно развернуть конкретный проект (если у меня их несколько) или использовать другую сборку (и, таким образом, преобразовать), я указываю вещи непосредственно в экземпляр веб-сайта Azure. Вот некоторые подробности, которые я написал по этому поводу
-O
вот ссылка на MSDN, которая подробно описывает это msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx
Hakan Fıstık
1
Ваше добавленное примечание относительно запуска сайта в VS через F5 и публикации было очень полезно для меня.
Денис М. Китчен
8

Возможно использование ConfigTransformцели сборки, доступной в виде пакета Nuget - https://www.nuget.org/packages/CodeAssassin.ConfigTransform/

Все файлы преобразования «web. * .Config» будут преобразованы и выведены в виде серии файлов «web. *. Config.transformed» в выходной каталог сборки независимо от выбранной конфигурации сборки.

То же самое относится к файлам преобразования «app. *. Config» в не веб-проектах.

а затем добавляем следующую цель в ваш *.csproj.

<Target Name="TransformActiveConfiguration" Condition="Exists('$(ProjectDir)/Web.$(Configuration).config')" BeforeTargets="Compile" >
    <TransformXml Source="$(ProjectDir)/Web.Config" Transform="$(ProjectDir)/Web.$(Configuration).config" Destination="$(TargetDir)/Web.config" />
</Target>

Публикация ответа, поскольку это первая публикация Stackoverflow, появившаяся в Google по этой теме.

Деннис
источник
Этот замечательный метод отлично сработал для меня, однако мне не пришлось устанавливать упомянутый вами ConfigTransform (который всегда преобразует все конфигурации) - я просто установил активную конфигурацию сборки в Visual Studio (например, я меняю ее на отладку), создаю решение и вуаля!
BornToCode 07
5

Чтобы преобразование работало в процессе разработки (с помощью F5 или CTRL + F5), я помещаю ctt.exe ( https://ctt.codeplex.com/ ) в папку пакетов (packages \ ConfigTransform \ ctt.exe).

Затем я регистрирую событие до или после сборки в Visual Studio ...

$(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config"
$(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)web.config" transform:"$(ProjectDir)web.$(ConfigurationName).config" destination:"$(ProjectDir)web.config"

Для преобразований я использую расширение SlowCheeta VS ( https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5 ).

Эмануэль Нильссон
источник
1
Чтобы сохранить пробелы (предотвращает размещение преобразованной конфигурации в одной строке), добавьте в командную строку отступ IndentChars: "" preservewhitespace. $(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config" preservewhitespace indent IndentChars:" "
Эмануэль Нильссон
3

Если вы собираетесь заменить все строки подключения на новостные для производственной среды, вы можете просто заменить все строки подключения на производственные, используя следующий синтаксис:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

<connectionStrings xdt:Transform="Replace">
    <!-- production environment config --->
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Testing1" connectionString="Data Source=test;Initial Catalog=TestDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
</connectionStrings>
....

Информация для этого ответа взята из этого ответа и этого сообщения в блоге .

Примечание : как уже объясняли другие, этот параметр будет применяться только при публикации приложения, а не при его запуске / отладке (путем нажатия F5).

VSB
источник