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?

Відповіді:


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. Ось деякі подробиці, про які я ще деякий час писав: freshconsulting.com/…
Dillie-O

ось посилання на MSDN, де це детально описано msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx
Хакан Фістик

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

5

Щоб перетворення працювало у розробці (за допомогою F5 або CTRL + F5), я опускаю ctt.exe ( https://ctt.codeplex.com/ ) у папку пакети (пакети \ 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: "". $(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).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.