现在我以不同的方式在SO上看过这个问题,但令人惊讶的是不是这种形式:
我有一个需要互相交流的多个Web服务(项目)的解决方案。发布后,这些Web服务中的每一个都可能最终位于具有不同数据库的不同计算机上。为了告诉每个Web服务所有其他Web服务的位置,我想在开发期间维护一个配置文件。
我希望在发布配置后出现在每个已发布的项目中。我希望配置文件在发布后可以编辑,这样我就可以快速迁移某个Web服务,然后只编辑其他Web服务的所有配置文件。
我不想在数据库中这样做,对于配置文件,它自己也应该保持对数据库的连接设置。
我遇到了以下想法/想法/问题:
System.Configuration.ConfigurationManager.OpenExeConfiguration("shared.config")
来读出shared.config。只需要确保shared.config将与DLL一起发布。我赞成这个解决方案,因为它还允许我在每个项目中保留web.config,只有项目特定的设置。并让shared.config具有共享设置。但是,我在读到这一点时,不应该轻易考虑这一点,并且可能会产生一些不必要的副作用,例如文件访问问题;虽然我想知道这是否适用于我的情况。此外,我想请求您的帮助,如何实际实现这一点,因为我认为Visual Studio不支持开箱即用的DLL项目的app.config。
<appSettings configSource="shared.config" />
指向该项目中的链接文件。虽然我找不到任何理由不这样做,但第一次实施失败了。看来(至少在开发期间),c#无法找到链接的shared.config文件。我猜测创建链接文件后链接文件不会立即完成,也不会维护,但文件只会在我发布时复制到项目中。因此在开发期间丢失文件。这是对的吗?
答案 0 :(得分:6)
配置文件是特定于应用的。这意味着您可以将配置文件添加到类库中,但该文件将由引用该库的应用程序(Windows服务,Web服务等)使用。
外部configSource
也是如此,这也是应用程序特定的,需要包含在使用它的项目中。
因此,如果您的解决方案由2个项目组成,那么您需要2个配置文件。每个项目一个。
对于基于Windows的应用程序(服务,winforms),配置文件的预期文件夹是bin
目录,对于基于Web的项目,这将是目录是虚拟目录的根文件夹。
这就是说,使用共享配置文件看起来更容易解决(并且您不必为每个项目从类库中复制app.config)。以下是步骤:
此时,每次编译解决方案时都应该将配置文件部署到项目目录中。
编辑:
答案 1 :(得分:0)
如果您在IIS中托管,则可以在根站点级别拥有一个web.config文件,但Giorgio是正确的,因为app.config文件是特定于应用程序的。可以使用自定义构建步骤在多个项目中自动复制配置文件,所以我个人会这样做。
答案 2 :(得分:0)
这实际上让我有点疯狂。最后我修理了这个:
bin
文件夹中结束。SharedConfiguration
。真正棘手的部分是必须使用Open Mapped
ExeConfiguration(),并获取可执行目录的路径(包括bin,并且前面没有file://)。SharedConfiguration.instance.AppSettings.Settings["CubilisEntryPointUrl"].Value
。(由于this issue)
,我无法直接使用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);
}
}