Web.Configdebugging/发布

我知道在Visual Studio 2010中的web.config提供了从数据库从debugging模式切换到发布模式的能力。

这是我的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数据库连接string?

为了将当前web.config文件“转换”为.Debug或.Release版本,作为Visual Studio 2010的一部分的web.config变换使用XSLT。

在您的.Debug / .Release文件中,您需要在连接string字段中添加以下参数:

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

这将导致每个连接string行find匹配的名称并相应地更新属性。

注意:您不必担心在转换文件中更新您的providerName参数,因为它们不会更改。

这里是我的一个应用程序的例子。 这是web.config文件部分:

 <connectionStrings> <add name="EAF" connectionString="Data Source=NTSQLT\S2K5TST;Initial Catalog=HR;User ID=EAFApp;Password=XXXX" providerName="System.Data.SqlClient" /> </connectionString> 

这里是web.config.release部分做适当的转换:

 <connectionStrings> <add name="EAF" connectionString="Data Source=NTSQLP\S2K5TST;Initial Catalog=HR;User ID=EAFApp;Password=YYYY" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> </connectionStrings> 

一个补充说明:转换只发生在您发布该网站时,而不是当您使用F5或CTRL + F5运行时。 如果您需要在本地运行针对给定configuration的更新,则必须手动更改您的Web.config文件。

有关更多详细信息,请参阅MSDN文档

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

为了使转换工作在开发中(使用F5或CTRL + F5),我在packages文件夹(packages \ ConfigTransform \ ctt.exe)中删除ctt.exe( https://ctt.codeplex.com/ )。

然后,我在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 )。

可以使用ConfigTransform构build目标作为Nuget包提供 – https://www.nuget.org/packages/CodeAssassin.ConfigTransform/

所有“web。 * .config”转换文件都将被转换并输出为构build输出目录中的一系列“web。*。config.transformed”文件,而不pipe所选的构buildconfiguration如何。

这同样适用于非web项目中的“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> 

发布一个答案,因为这是关于这个主题在Google上出现的第一个Stackoverflowpost。

如果您要将所有连接stringreplace为生产环境的新连接string ,则可以使用以下语法简单地将所有连接stringreplace为生产连接string:

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

这个答案的信息是从这个答案和这个博客文章 。

注意 :正如其他人已经解释过的那样,这个设置只适用于应用程序在运行/debugging时不发布(按F5)。