【问题标题】:Read configuration from App.config instead of AppName.exe.config从 App.config 而不是 AppName.exe.config 读取配置
【发布时间】:2017-10-24 13:40:44
【问题描述】:

我开发了一个小型 Windows 服务,它执行很少的数据库操作。我必须为用户提供一个选项以在部署后更改服务器名称。如果用户在 app.config 中更改它不会影响服务,它仍在从 AppName.exe.config 读取连接字符串。

这是我尝试过的。

<connectionStrings>
<add name="testString" connectionString="Data Source=ServerAddresss;Initial Catalog=DatabaseName;Integrated Security=True;" />
</connectionStrings>

C# 代码,

ConfigurationManager.ConnectionStrings["ProjectName.Properties.Settings.testString"].ConnectionString);

这会从 AppName.exe.config 文件返回一个服务器连接字符串,但我想从 App.config 文件中访问它。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你的问题我会有点偏题。我不建议找到一种方法让您的服务从不同的配置文件中读取。相反,请使用配置转换,以便您想要的连接字符串已经在已经部署的一个配置文件中。
  • 很难理解这一点,app.config 仅作为项目项存在。只需使用 XmlDocument 读取 xml 文件。
  • @HansPassant 。是的,没错,现在才知道。

标签: c# .net winforms connection-string


【解决方案1】:

App.config 和 AppName.exe.config 并不完全分开 - AppName.exe.config 是 app.config 的构建输出。

换句话说,一旦部署了服务,甚至不应该更改 app.config,如果有,更改它不会有任何作用。 AppName.exe.config 您的应用程序获取“app.config”值的地方。

如果您需要针对不同环境使用不同的配置值,请查看config transformations。它们允许您更改或替换不同配置(例如调试、发布或其他自定义配置)的部分或单个值。

这很有用,因为它意味着所有连接字符串都是项目的一部分并且在源代码控制中。您可以不这样做,只需在服务器上编辑配置文件,但是源代码控制中将没有任何内容指示连接字符串的来源。然后,如果您重新部署服务,除非有人记得每次都进行相同的更改,否则更改将被覆盖。将它放在源代码管理中会好得多。

出于某种我不明白的原因,您可以右键单击 web.config 并选择“添加配置转换”,但您不能使用 app.config 执行此操作。也许有一个很好的理由。

您可以安装this extension,它为 app.config 启用相同的行为。然后您可以右键单击 app.config 并为另一个配置添加转换,例如 Release。

在该文件 (app.Release.config) 中添加:

<connectionStrings xdt:Transform="Replace">
    <add name="testString" connectionString="...your Release connection string..." />
</connectionStrings>

当您使用 Release 配置构建和部署时,它会将 connectionStrings 部分替换为该部分,而其他所有内容都保持原样。您也可以右键单击 app.Release.config 并选择“Preview Config Transforms”以将转换后的文件与原始文件并排查看。

【讨论】:

    【解决方案2】:

    您应该能够使用 ConfigurationFileMap 拉入任意文件

    System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
    System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
    

    此问题可能与以下问题重复:Using ConfigurationManager to load config from an arbitrary location

    此外,您必须确保在更新配置文件(任一配置文件)后重新启动服务。

    【讨论】:

    • 虽然这行得通,但它确实只是解决了问题。现在服务必须“知道”它在开发、QA 或生产环境中,以便它知道要打开哪个配置文件。它怎么知道的?可能在 app.config 中还有另一个值,例如 &lt;add key="environment" value="dev" /&gt;。现在,您必须确保 that 值被更改,而不是确保连接字符串被更改。因此,从某种意义上说,您最终会遇到与开始时相同的问题的不同版本。
    • 总的来说,我同意你的看法。但是,对于 OP 的部署过程,可能存在一些特殊情况,这可能会使该解决方案变得可取。例如:不是使用“发布”方案,而是手动将文件复制到部署位置。在这种情况下,将静态的、特定于环境的配置文件部署到服务器可能会更方便。
    猜你喜欢
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 2021-09-30
    • 2012-08-20
    相关资源
    最近更新 更多