能否在Web.config中引用Appsettings.config的配置值?
问题描述
我有两个配置文件:Appsettings.config 和 Web.config,希望在Web.config中直接引用Appsettings.config里的配置值,具体场景如下:
Appsettings.config 内容
<appsettings> <add key="ServerName" value="CURSE\SQL2019"/> <add key="Endpoint" value="C:\Test\Endpoint"/> </appsettings>
Web.config 的两个需求场景
- 连接字符串中引用
ServerName的值:
<connectionStrings> <add name="MyConnection" connectionString="data source=*(此处需使用ServerName的配置值)*;Initial Catalog=HPE_DEV;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/> </connectionStrings>
- 服务端点地址中引用
Endpoint的值:
<appsettings> <endpoint address="(*需使用Appsettings.config中Endpoint的配置值*)" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Test" contract="TestService.TestService" name="TestService"/> </appsettings>
我尝试过直接在Web.config里写键名Endpoint但没生效,尝试的代码:
<appsettings> <endpoint address="Endpoint" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Test" contract="TestService.TestService" name="TestService"/> </appsettings>
请问能不能通过变量方式在配置文件里实现这个需求?
解决方案
可以通过配置文件的引用和变量替换实现,以下是针对两个场景的具体做法:
第一步:让Web.config加载Appsettings.config
首先要确保Web.config能读取到Appsettings.config的配置,在Web.config的appSettings节点中添加外部文件引用:
<appSettings configSource="Appsettings.config" />
如果Appsettings.config不在项目根目录,需填写相对路径,比如config/Appsettings.config。
场景1:连接字符串引用ServerName
ASP.NET原生支持在连接字符串中用${键名}的格式引用appSettings中的值,修改后的连接字符串如下:
<connectionStrings> <add name="MyConnection" connectionString="data source=${ServerName};Initial Catalog=HPE_DEV;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/> </connectionStrings>
场景2:服务端点地址引用Endpoint
WCF的端点地址不支持直接在配置文件中做变量替换,推荐通过代码读取配置并赋值的方式实现:
- 先将Web.config里的endpoint地址设为占位符(或留空):
<system.serviceModel> <services> <service name="TestService.TestService"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Test" contract="TestService.TestService" name="TestService"/> </service> </services> </system.serviceModel>
- 在服务初始化代码中(比如Global.asax或服务宿主启动逻辑)读取配置并修改地址:
// 读取Appsettings中的Endpoint配置值 string endpointAddress = ConfigurationManager.AppSettings["Endpoint"]; // 获取服务宿主实例 ServiceHost host = new ServiceHost(typeof(TestService)); // 找到目标端点并更新地址 foreach (ServiceEndpoint endpoint in host.Description.Endpoints) { if (endpoint.Name == "TestService") { endpoint.Address = new EndpointAddress(endpointAddress); break; } } host.Open();
如果不想编写代码,也可以使用Web.config变换工具(如SlowCheetah),在发布阶段将配置值替换到端点地址中,但这种方式属于静态替换,运行时无法动态更新配置。
内容的提问来源于stack exchange,提问作者curs3m4rk
相关产品推荐
相关产品推荐

