【问题标题】:Web.Config Debug/ReleaseWeb.Config 调试/发布
【发布时间】:2011-08-14 06:07:43
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net web-config


    【解决方案1】:

    作为 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/en-us/library/dd465326(VS.100).aspx

    【讨论】:

    • 您能否添加一条注释,说明这发生在发布时间而不是 F5 时间的答案中?显然我已经正确了 2 个小时,但没有意识到这一点。
    • 如何使用 Visual Studio Online Continuous Build 进行这项工作?我希望它在构建和部署到 Azure 期间转换我的 Web.Config。
    • @RosdiKasim - 我不确定这是否会 100% 匹配 Visual Studio 在线,但是当我需要部署特定项目(如果我有多个)或使用不同的构建(和因此转换)我直接在 Azure 网站实例中指定内容。这是我不久前写的一些细节:freshconsulting.com/…
    • 这里是一个指向 MSDN 的链接,详细描述了这一点 msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx
    • 您添加的关于通过 F5 与发布在 VS 中运行网站的注释对我非常有帮助。
    【解决方案2】:

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

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

    此答案的信息来自this answerthis blog post

    注意:正如其他人已经解释的那样,此设置仅在应用程序发布时应用,而不是在运行/调试时应用(按 F5)。

    【讨论】:

      【解决方案3】:

      可以使用作为 Nuget 包提供的 ConfigTransform 构建目标 - 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>
      

      发布答案,因为这是在 Google 上出现的关于该主题的第一篇 Stackoverflow 帖子。

      【讨论】:

      • 这个很棒的方法对我来说非常有效。但是,我不必安装您提到的 ConfigTransform NuGet(它具有始终转换所有配置的效果)。我刚刚在您对 csproj 的回答中复制了目标 sn-p。然后,当我在 Visual Studio 上设置活动构建配置(例如,将其更改为调试)时,转换会在我构建解决方案时相应地完成。
      【解决方案4】:

      为了使转换在开发中工作(使用 F5 或 CTRL + F5),我将 ctt.exe (https://ctt.codeplex.com/) 放到包文件夹 (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)。

      【讨论】:

      • 为了保留空格(防止转换后的配置在一行上)添加 preservewhitespace indent IndentChars:" " 到命令行。 $(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config" preservewhitespace indent IndentChars:" "
      猜你喜欢
      • 2012-05-08
      • 2013-06-08
      • 2012-05-31
      • 2023-04-08
      • 2015-12-22
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      相关资源
      最近更新 更多