Web.Config调试/发布


82

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

这是我的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文件中没有任何显示。它没有显示实时数据库连接字符串吗?

Answers:


131

作为Visual Studio 2010一部分的web.config转换使用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/zh-CN/library/dd465326(VS.100).aspx


20
您能否在答案中添加注释,指出发生在发布时间而不是F5时间?显然我已经纠正了2个小时,但是没有意识到。
保罗

如何使用Visual Studio Online连续生成功能使它起作用?我希望它在构建过程中转换Web.Config并将其部署到Azure。
Rosdi Kasim 2015年

1
@RosdiKasim-我不确定这是否可以与Visual Studio Online匹配100%,但是当我需要部署特定项目(如果我有多个项目)或使用其他构建(并因此进行转换)时,可以直接在其中指定内容Azure网站实例。这是我不久前
Dillie-O

这是指向MSDN的链接,该链接详细说明了此信息msdn.microsoft.com/zh-cn/library/dd465326(VS.100).aspx
HakanFıstık2015年

1
您添加的关于通过F5与发布在VS中运行网站的说明对我很有帮助。
Denis M. Kitchen

8

这是可能使用ConfigTransform可作为NuGet包构建目标- https://www.nuget.org/packages/CodeAssassin.ConfigTransform/

无论选择何种构建配置,所有“ web。*。config”转换文件都将在构建输出目录中转换并输出为一系列“ web。*。config.transformed”文件。

非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在该主题上出现的第一篇Stackoverflow帖子。


这种出色的方法对我而言非同寻常,但我不必安装您提到的ConfigTransform(它始终会转换所有配置)-我只是在Visual Studio上设置了活动的生成配置(例如,将其更改为调试),生成解决方案并瞧!
BornToCode

5

为了使转换能够在开发中工作(使用F5或CTRL + F5),我将ctt.exe(https://ctt.codeplex.com/)放在了packages文件夹(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
为了保留空白(防止转换后的配置在一行上),请在命令行中添加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

如果要将生产环境中的所有连接字符串替换为新闻连接,则可以使用以下语法简单地将所有连接字符串替换为生产连接:

<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键)不适用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.