如何在运行时根据构建配置拥有不同的连接字符串

问题描述 投票:0回答:1

我尝试根据构建配置使用不同的连接字符串集。 (调试,发布,测试版,本地训练等...)使用配置转换文件,例如

web.beta.config
可以轻松实现部署过程中的目标,但是我希望更改也可以在按F5时生效,以帮助本地调试和测试.

我尝试在

Application_Start
期间更新连接字符串。想法是拥有一个环境变量并根据它更新连接字符串。该变量可以轻松地在部署服务器中设置,但我不知道如何基于
$(configuration)
设置环境变量以在本地运行。此外,我发现如下所示更新配置的方式会导致
web.config
文件被修改,我担心这会引起问题。

if (System.Web.HttpContext.Current != null)
{
    config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
}
else
{
    config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
}
var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
connectionStringsSection.ConnectionStrings["DefaultConnection"].ConnectionString = "my connection string";
config.Save();
ConfigurationManager.RefreshSection("connectionStrings");

我是否试图实现一些不寻常的目标,或者我只是没有找到正确的方法来实现它?实现这一目标的正确方法是什么?


有一些方法使用模板 web.config 文件并在构建后使用

TransformXml
。然而,每次Nuget包更新后都需要手动更新base.config的风险太大。而且
SlowCheetah
不适用于 Web 项目的调试。

注意:申请是在

.NET Framework 4.8
,而不是
Core

.net visual-studio msbuild connection-string .net-4.8
1个回答
0
投票

您可以使用 ASP.NET 配置生成器 来完成此操作。

它允许您创建一个类,该类将挂钩

web.config
的加载并修改配置部分。我有一个示例,演示如何使用 ASP.NET Core 样式 appsettings.*.json 配置文件来填充 ASP.NET 4 AppSettings 和 ConnectionStrings,网址为 https://github.com/dasMulli/ConfigSampleWebApp

对于您的方法,您可以创建一个继承自

ConfigurationBuilder
的自定义类来处理配置部分:

public class MyConnectionStringConfigurationBuilder : ConfigurationBuilder
{
    // you can use #if / #elif etc to rely on build configuration or read enviornment variables to switch environments

#if DEBUG
    private const string DefaultEnvironmentName = "Development";
#else
    private const string DefaultEnvironmentName = "Production";
#endif
    public override ConfigurationSection ProcessConfigurationSection(ConfigurationSection configSection)
    {
        switch (configSection)
        {
            case ConnectionStringsSection connectionStringsSection:
                // modify connectionStringsSection as needed
                // e.g. by reading the connection string from a different file or using one of the provided non-default connection strings with a "default" name that is used later on in your application
                return connectionStringsSection;
            default:
                return base.ProcessConfigurationSection(configSection);
        }
    }
}

这个课程可以在

web.config
注册:

<configuration>
  <configSections>
    <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false"/>
  </configSections>

  <configBuilders>
    <builders>
      <add name="MyConnectionStringConfigurationBuilder" type="MyApp.MyConnectionStringConfigurationBuilder , MyApp"/>
    </builders>
  </configBuilders>

  <connectionStrings configBuilders="MyConnectionStringConfigurationBuilder">
    <clear/>
    ... <!-- e.g. add "Database_Development" and "Database_Production" and set "Database" from one of these in the config builder. -->
  </connectionStrings>

  ...
</configuration>
© www.soinside.com 2019 - 2024. All rights reserved.