10

现在我以前在 SO 上以不同的方式看到过这个问题,但令人惊讶的是不是这种形式:

我有一个包含多个需要相互通信的 Web 服务(项目)的解决方案。在发布这些 Web 服务中的每一个之后,最终可能会在具有不同数据库的不同机器上结束。为了告诉每个 Web 服务所有其他 Web 服务在哪里,我想在开发过程中维护一个配置文件。

我希望在发布配置后会出现在每个已发布的项目中。而且我希望配置文件在发布后是可编辑的,这样我就可以快速迁移某个 Web 服务,然后只需编辑其他 Web 服务的所有配置文件。

我不想在数据库中执行此操作,因为配置文件本身也应该保存与数据库的连接设置。

我遇到了以下想法/想法/问题:

  • 我有一个名为“common”的 dll 项目,它被其他项目引用。让我们给它一个 shared.config 并在该项目中构建一个类,该类可用于读取 shared.config System.Configuration.ConfigurationManager.OpenExeConfiguration("shared.config")。只需要确保 shared.config 将与 DLL 一起发布。

我喜欢这个解决方案,因为它还可以让我在每个项目中保留一个 web.config,其中只有项目特定的设置。并让 shared.config 具有共享设置。但是我在 SO 上读到,这不应该被轻视,并且可能会产生一些不需要的副作用,例如文件访问问题;虽然我想知道这是否适用于我的情况。另外,我想请你帮忙看看如何实际实现这一点,因为我认为 Visual Studio 不支持开箱即用的 DLL 项目的 app.config。

  • 我还考虑在解决方案项中创建一个 shared.config 文件。然后在每个项目中链接该文件。并在每个项目的Web.config中,添加:<appSettings configSource="shared.config" />指向该项目中的链接文件。

虽然我找不到任何不这样做的理由,但第一次实施失败了。似乎(至少在开发过程中),c# 找不到链接的 shared.config 文件。我猜链接文件不会立即完成,也不会在创建链接文件后维护,但文件仅在我发布时复制到项目中。从而使文件在开发过程中丢失。这个对吗?

4

3 回答 3

6

配置文件是特定于应用程序的。这意味着您可以将配置文件添加到类库,但该文件将被引用该库的应用程序(Windows 服务、Web 服务等)使用。

external 也是一样configSource,这也是特定于应用程序的,需要包含在使用它的项目中。因此,如果您的解决方案由 2 个项目组成,那么您需要 2 个配置文件。每个项目一个。

对于基于 Windows 的应用程序(服务、winforms),配置文件的预期文件夹是bin目录,对于基于 Web 的项目,该目录是虚拟目录的根文件夹。

这就是说,使用共享配置文件看起来更简单(并且您不必为每个项目从类库中复制 app.config)。以下是步骤:

  • 创建解决方案文件夹。
  • 将配置文件添加到其中。
  • 添加该文件作为每个需要它的项目的参考。右键单击项目并添加现有项目- >选择文件并添加为链接
  • 通过使用“始终复制”设置复制选项(文件的属性),确保始终复制文件。

此时,您应该在每次编译解决方案时将配置文件部署到项目目录中。

编辑:

  • 我会避免在 web 应用程序中查看配置文件的 bin,约定是文件应该在根目录中,所以我会避免第一个选项。
  • 构建项目后,链接的文件最终会在 bin 中。尝试导入文件的相同步骤,但这次只需添加它(而不是链接),它将作为内容部署在您网站的根目录中,因此它始终可用。
于 2013-03-19T10:06:07.527 回答
0

如果您在 IIS 中托管,则可以在根站点级别拥有一个 web.config 文件,但 Giorgio 是正确的,因为 app.config 文件是特定于应用程序的。可以使用自定义构建步骤来自动跨多个项目复制配置文件,所以我个人会这样做。

于 2013-03-19T10:10:39.157 回答
0

这实际上让我有点发疯。最后我把它修好了:

  • 在 dll 项目“common”中创建了一个 Shared.config 文件,其内容看起来像任何普通的 web.config/app.config。
  • 将文件设置为 Content and Copy Always,这样它肯定会被复制到所有引用项目 common 的项目中。(虽然配置文件确实会在bin文件夹中结束。
  • SharedConfiguration在公共项目中创建了类。真正棘手的部分是必须使用 Open MappedExeConfiguration() 并获取可执行目录的路径(包括 bin,并且前面没有 file://)。
  • 现在,当我想从共享设置中访问设置时,我会使用SharedConfiguration.instance.AppSettings.Settings["CubilisEntryPointUrl"].Value.

SharedConfiguration.instance.AppSettings["CubilisEntryPointUrl"](因为这个问题,我不能直接使用)

.

public static class SharedConfiguration
{
    public static readonly Configuration instance = GetConfiguration("Shared.config");
    private static Configuration GetConfiguration(string configFileName)
    {
        ExeConfigurationFileMap exeConfigurationFileMap = new ExeConfigurationFileMap();
        Uri uri = new Uri(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase));
        exeConfigurationFileMap.ExeConfigFilename = Path.Combine(uri.LocalPath, configFileName);
        return ConfigurationManager.OpenMappedExeConfiguration(exeConfigurationFileMap, ConfigurationUserLevel.None);
    }
}
于 2013-03-19T15:11:36.200 回答