Web.Config Debug / Release

82

Wiem, że web.config w Visual Studio 2010 zapewnia możliwość przełączania się z baz danych z trybu debugowania do trybu wydania.

Oto mój 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>

Oto mój kod 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>

A to jest mój kod 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>

Kiedy publikuję swój projekt, nic nie jest wyświetlane w moim pliku Web.config. Nie wyświetla się moje parametry połączenia z usługą Live Database?

RG-3
źródło

Odpowiedzi:

131

Transformacje web.config, które są częścią programu Visual Studio 2010, używają XSLT w celu „przekształcenia” bieżącego pliku web.config do jego wersji .Debug lub .Release.

W swoich plikach .Debug / .Release musisz dodać następujący parametr w polach parametrów połączenia:

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

Spowoduje to, że każdy wiersz parametrów połączenia znajdzie pasującą nazwę i odpowiednio zaktualizuje atrybuty.

Uwaga: nie musisz martwić się o aktualizację parametru providerName w plikach transformacji, ponieważ się one nie zmieniają.

Oto przykład z jednej z moich aplikacji. Oto sekcja pliku web.config:

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

A oto sekcja web.config.release wykonująca odpowiednią transformację:

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

Jedna dodatkowa uwaga: transformacje mają miejsce tylko wtedy, gdy publikujesz witrynę, a nie po prostu uruchamiasz ją za pomocą F5 lub CTRL + F5. Jeśli chcesz przeprowadzić aktualizację lokalnie dla danej konfiguracji, będziesz musiał ręcznie zmienić w tym celu plik Web.config.

Więcej informacji można znaleźć w dokumentacji MSDN

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

Dillie-O
źródło
20
Czy możesz dodać uwagę, że dzieje się to w czasie publikacji, a nie w czasie F5 do odpowiedzi? Najwyraźniej miałem to poprawne przez 2 godziny, ale nie zdawałem sobie z tego sprawy.
Paul
Jak mogę sprawić, by to działało z Visual Studio Online Continuous Build? Chcę, aby przekształcił mój plik Web.Config podczas kompilowania i wdrażania na platformie Azure.
Rosdi Kasim
1
@RosdiKasim - nie jestem pewien, czy to będzie pasować w 100% dla Visual Studio online, ale kiedy muszę wdrożyć określony projekt (jeśli mam wiele) lub użyć innej kompilacji (a tym samym transformacji), określam rzeczy bezpośrednio w wystąpienie witryny internetowej platformy Azure. Oto kilka szczegółów, które napisałem na ten temat jakiś czas temu: freshconsulting.com/…
Dillie-O
tutaj jest łącze do MSDN, które szczegółowo to opisuje msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx
Hakan Fıstık
1
Twoja dodatkowa uwaga dotycząca prowadzenia strony w VS przez F5 vs. publikowanie była dla mnie bardzo pomocna.
Denis M. Kitchen
8

Jest to możliwe przy użyciu ConfigTransformcelu kompilacji dostępnego jako pakiet Nuget - https://www.nuget.org/packages/CodeAssassin.ConfigTransform/

Wszystko "internet. * pliki transformacji .Config” zostaną przekształcone i wyprowadzone jako seria plików „web. *. Config.transformed” w katalogu wyjściowym kompilacji, niezależnie od wybranej konfiguracji kompilacji.

To samo dotyczy plików transformacji „app. *. Config” w projektach innych niż internetowe.

a następnie dodając następujący cel do pliku *.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>

Publikowanie odpowiedzi, ponieważ jest to pierwszy post Stackoverflow, który pojawia się w Google na ten temat.

Dennis
źródło
Ta świetna metoda zadziałała dla mnie nadzwyczajnie, jednak nie musiałem instalować wspomnianego przez Ciebie ConfigTransform (który zawsze przekształca wszystkie konfiguracje) - po prostu ustawiam aktywną konfigurację kompilacji w Visual Studio (np. Zmieniam ją na debugowanie), buduję rozwiązanie i voila!
BornToCode
5

Aby transformacja działała w fazie rozwoju (przy użyciu F5 lub CTRL + F5), upuszczam plik ctt.exe ( https://ctt.codeplex.com/ ) w folderze pakietów (packages \ ConfigTransform \ ctt.exe).

Następnie rejestruję zdarzenie przed lub po kompilacji w programie 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"

Do transformacji używam rozszerzenia SlowCheeta VS ( https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5 ).

Emanuel Nilsson
źródło
1
Aby zachować spacje (zapobiega umieszczaniu przekształconej konfiguracji w jednym wierszu), dodaj do wiersza poleceń preservewhitespace indent IndentChars: "". $(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config" preservewhitespace indent IndentChars:" "
Emanuel Nilsson
3

Jeśli zamierzasz zamienić wszystkie parametry połączenia na nowe dla środowiska produkcyjnego, możesz po prostu zamienić wszystkie parametry połączenia na produkcyjne, używając następującej składni:

<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>
....

Informacje dotyczące tej odpowiedzi pochodzą z tej odpowiedzi i tego wpisu na blogu .

uwaga : jak wyjaśnili inni, to ustawienie będzie obowiązywać tylko wtedy, gdy aplikacja będzie publikować, a nie podczas jej uruchamiania / debugowania (przez naciśnięcie klawisza F5).

VSB
źródło