我尝试根据构建配置使用不同的连接字符串集。 (调试,发布,测试版,本地训练等...)使用配置转换文件,例如
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
。
您可以使用 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>