Web.Config Debug / Release

82

Ich weiß, dass web.config in Visual Studio 2010 die Möglichkeit bietet, von Datenbanken vom Debug-Modus in den Release-Modus zu wechseln.

Hier ist meine 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>

Hier ist mein Web.Debug.config-Code:

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

Und das ist mein Web.config-Code:

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

Wenn ich mein Projekt veröffentliche, wird in meiner Datei "Web.config" nichts angezeigt. Wird meine Live Database-Verbindungszeichenfolge nicht angezeigt?

RG-3
quelle

Antworten:

131

Die web.config-Transformationen, die Teil von Visual Studio 2010 sind, verwenden XSLT, um die aktuelle web.config-Datei in ihre .Debug- oder .Release-Version zu "transformieren".

In Ihren .Debug / .Release-Dateien müssen Sie den folgenden Parameter in Ihre Verbindungszeichenfolgenfelder einfügen:

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

Dies führt dazu, dass jede Verbindungszeichenfolge den passenden Namen findet und die Attribute entsprechend aktualisiert.

Hinweis: Sie müssen sich nicht um die Aktualisierung Ihres ProviderName-Parameters in den Transformationsdateien kümmern, da sich diese nicht ändern.

Hier ist ein Beispiel aus einer meiner Apps. Hier ist der Abschnitt mit der Datei web.config:

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

Und hier ist der Abschnitt web.config.release, der die richtige Transformation durchführt:

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

Ein zusätzlicher Hinweis: Transformationen treten nur auf, wenn Sie die Site veröffentlichen, nicht, wenn Sie sie einfach mit F5 oder STRG + F5 ausführen. Wenn Sie ein Update für eine bestimmte Konfiguration lokal ausführen müssen, müssen Sie dazu Ihre Web.config-Datei manuell ändern.

Weitere Informationen finden Sie in der MSDN-Dokumentation

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

Dillie-O
quelle
20
Können Sie der Antwort einen Hinweis hinzufügen, dass dies in der Veröffentlichungszeit NICHT in der F5-Zeit geschieht? Anscheinend habe ich das 2 Stunden lang richtig gemacht, aber das habe ich nicht bemerkt.
Paul
Wie kann ich diese Funktion mit Visual Studio Online Continuous Build ausführen? Ich möchte, dass meine Web.Config während der Erstellung und Bereitstellung in Azure transformiert wird.
Rosdi Kasim
1
@RosdiKasim - Ich bin nicht sicher, ob dies für Visual Studio online zu 100% übereinstimmt, aber wenn ich ein bestimmtes Projekt bereitstellen muss (wenn ich mehrere habe) oder einen anderen Build verwenden (und damit transformieren) muss, gebe ich die Dinge direkt an die Azure-Website-Instanz. Hier sind einige Details, die ich vor einiger Zeit geschrieben habe: freshconsulting.com/…
Dillie-O
Hier ist ein Link zu MSDN, der dies im Detail beschreibt. msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx
Hakan Fıstık
1
Ihr zusätzlicher Hinweis zum Ausführen der Site in VS über F5 im Vergleich zum Veröffentlichen war für mich sehr hilfreich.
Denis M. Kitchen
8

Es ist möglich ConfigTransform, das als Nuget-Paket verfügbare Build-Ziel zu verwenden - https://www.nuget.org/packages/CodeAssassin.ConfigTransform/

Alle "web. * .Config" -Transformationsdateien werden transformiert und als eine Reihe von "web. *. Config.transformed" -Dateien im Build-Ausgabeverzeichnis ausgegeben, unabhängig von der ausgewählten Build-Konfiguration.

Gleiches gilt für "app. *. Config" -Transformationsdateien in Nicht-Webprojekten.

und fügen Sie dann das folgende Ziel zu Ihrem hinzu *.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>

Veröffentlichen einer Antwort, da dies der erste Stackoverflow-Beitrag ist, der in Google zu diesem Thema angezeigt wird.

Dennis
quelle
Diese großartige Methode hat für mich außergewöhnlich funktioniert, ich musste jedoch nicht die von Ihnen erwähnte ConfigTransform installieren (die immer alle Konfigurationen transformiert) - ich habe nur die aktive Build-Konfiguration in Visual Studio festgelegt (z. B. ändere ich sie in Debug), die Lösung erstellt und voila!
BornToCode
5

Damit die Transformation in der Entwicklung funktioniert (mit F5 oder STRG + F5), lege ich ctt.exe ( https://ctt.codeplex.com/ ) im Paketordner (packages \ ConfigTransform \ ctt.exe) ab.

Dann registriere ich ein Pre- oder Post-Build-Ereignis in 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"

Für die Transformationen verwende ich die SlowCheeta VS-Erweiterung ( https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5 ).

Emanuel Nilsson
quelle
1
Um Leerzeichen beizubehalten (verhindert, dass sich die transformierte Konfiguration in einer Zeile befindet), fügen Sie der Befehlszeile den Leerzeicheneinzug IndentChars: "" hinzu. $(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config" preservewhitespace indent IndentChars:" "
Emanuel Nilsson
3

Wenn Sie alle Verbindungszeichenfolgen durch neue für die Produktionsumgebung ersetzen möchten, können Sie einfach alle Verbindungszeichenfolgen durch Produktionszeichenfolgen mit der folgenden Syntax ersetzen:

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

Informationen für diese Antwort stammen aus dieser Antwort und diesem Blog-Beitrag .

Hinweis : Wie bereits erläutert, gilt diese Einstellung nur, wenn die Anwendung veröffentlicht wird, nicht beim Ausführen / Debuggen (durch Drücken von F5).

VSB
quelle