为啥 ConfigurationManager.OpenMappedExeConfiguration 文件中没有额外的连接字符串?
Posted
技术标签:
【中文标题】为啥 ConfigurationManager.OpenMappedExeConfiguration 文件中没有额外的连接字符串?【英文标题】:Why does ConfigurationManager.OpenMappedExeConfiguration have an extra connection string not in the file?为什么 ConfigurationManager.OpenMappedExeConfiguration 文件中没有额外的连接字符串? 【发布时间】:2011-01-02 23:59:47 【问题描述】:我正在对 Win 表单应用程序的配置文件进行单元测试。
在 LocalTestRun.testrunconfig 中,我将其设置为复制 app.config。我在测试运行时检查了Environment.CurrentDirectory
,并且该文件也没有这个额外的连接字符串。这是测试方法:
[TestMethod]
public void Configuration_ConnectionStrings_Connect()
Console.WriteLine(Environment.CurrentDirectory);
Assert.IsTrue(System.IO.File.Exists("App.Config"));
var configFileMap = new ExeConfigurationFileMap() ExeConfigFilename = "App.Config";
var config= ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
foreach (ConnectionStringSettings connectionString in config.ConnectionStrings.ConnectionStrings)
//Assumes all connections are to Sql server, test must be updated if not
Assert.AreEqual("System.Data.SqlClient",connectionString.ProviderName,"Test was only designed for SQL clients");
using (var cn=new System.Data.SqlClient.SqlConnection(connectionString.ConnectionString))
cn.Open();
Assert.AreEqual(System.Data.ConnectionState.Open,cn.State);
但是,当我迭代 config.ConnectionStrings.ConnectionStrings
时,我有一个不在文件中的额外配置字符串:
data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true
这不是,也从来不是一个 asp.net 项目。
这是配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="HLIT_Ticketing.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<connectionStrings>
<add name="HLIT_Ticketing.Properties.Settings.HomeQConnectionString"
connectionString="Data Source=******\*****;Initial Catalog=*****;Persist Security Info=True;User ID=*****;Password=******"
providerName="System.Data.SqlClient" />
</connectionStrings>
<userSettings>
<HLIT_Ticketing.Properties.Settings>
<setting name="AssociateRole" serializeAs="String">
<value>Associate</value>
</setting>
<setting name="DeveloperRole" serializeAs="String">
<value>Developer</value>
</setting>
</HLIT_Ticketing.Properties.Settings>
</userSettings>
这个额外的连接字符串是从哪里来的?
【问题讨论】:
+1 我一直想知道这个,现在我知道了,谢谢:) 【参考方案1】:该连接字符串在机器级配置文件machine.config中定义。
如果您查看文件C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config
,您将看到以下部分:
<connectionStrings>
<add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
【讨论】:
有没有办法单独读取 app.config 而不是将 app.config 加载为 xml 文件? 不,抱歉 - 正如 marc_s 所说!【参考方案2】:Dave 给出了主要答案 - 赞成。
但是:如果您想从 machine.config 或任何“上游”web.configs 中删除任何连接字符串,您可以随时使用:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<clear />
<add name="HLIT_Ticketing.Properties.Settings.HomeQConnectionString"
connectionString="Data Source=******\*****;Initial Catalog=*****;Persist Security Info=True;User ID=*****;Password=******"
providerName="System.Data.SqlClient" />
</connectionStrings>
连接字符串部分中的第一个<clear/>
会清除所有以前存在的连接字符串,并从一个干净的状态开始。
【讨论】:
有没有办法告诉配置管理器只加载我指定用于测试的文件? 我想测试应用的配置文件,而不是机器的。 不,ASP.NET 配置系统已经是 machine.config、您的“根”web.config 以及任何潜在的“上游”web.configs 的层次结构。你无法改变这一点,这是一个非常基本的机制。 所以...有没有办法通过配置命名空间来只读 app.config 而不是 machine.config?还是让我使用 Linq to XML 进行此测试? .NET 配置故事正如我所说 - 它是 总是 machine.config -> "root" web.config -> 您的 web.config 或机器的层次结构。配置-> yourapp.exe.config。你不能改变它(除了自己阅读 XML,或者使用我提到的以上是关于为啥 ConfigurationManager.OpenMappedExeConfiguration 文件中没有额外的连接字符串?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 glTranslatef?为啥不直接更改渲染坐标?
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?