Asp.net IIS Web应用程序和类库配置-配置文件在部署时丢失

Asp.net IIS Web应用程序和类库配置-配置文件在部署时丢失,asp.net,configuration,Asp.net,Configuration,我有一个用C#4.0编写的ASP.NET web应用程序。应用程序引用一个类库,该类库附带有自己的配置文件。在运行时,类库使用类似以下代码加载此特定配置: var exeConfigPath = this.GetType().Assembly.Location; var config = ConfigurationManager.OpenExeConfiguration(exeConfigPath); Configuration config = null; try { var ex

我有一个用C#4.0编写的ASP.NET web应用程序。应用程序引用一个类库,该类库附带有自己的配置文件。在运行时,类库使用类似以下代码加载此特定配置:

var exeConfigPath = this.GetType().Assembly.Location;
var config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
Configuration config = null;
try 
{
    var exeConfigPath = this.GetType().Assembly.Location;
    config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
}
catch (Exception e)
{
    if (!IsConfigurationNotFoundError(e)) 
    {
        // IsConfigurationNotFoundError logic skipped for brevity
        var exeConfigPath = 
            ConfigurationManager.AppSettings["ClassLibrary_ConfigPath"];
        if (exeConfigPath != null) 
        {
            config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
        }
    }
    else
    {
        throw;
    }
}
这样做是因为库必须加载其捆绑配置,而不是应用程序配置。应用程序配置不应该与库的设置有关,也不应该能够更改它们

现在,为了让这个概念发挥作用,还需要做一些其他的事情。我必须在“属性”窗口中将库的配置文件生成操作设置为内容,并将副本设置为
Copy Always
Copy If Newer
。到目前为止还不错-该文件自动进入类库的bin目录和web应用程序的bin目录,并正确地从
App.config
重命名为
CustomLibrary.dll.config
(假定库的dll为CustomLibrary.dll)

现在我面临两个问题

1) 当我将web应用程序发布到文件系统位置(在IIS中映射)时,
CustomLibrary.dll.config
在已发布应用程序的bin文件夹中显示为
App.config
。好的-我将在类库项目中重命名它,以匹配预期的约定-问题解决了

2) 即使在发布时,IIS也会再次编译应用程序并将其存储在ASP.NET临时文件中。有一个奇特的目录结构,其中有一个专用于所引用的每个程序集的文件夹。与CustomLibrary.dll对应的文件夹中不包含配置文件。由于
this.GetType().Assembly.Location
将返回临时文件夹的路径,因此应用程序无法加载配置,并按其应该的方式崩溃

我需要保留在类库中配置的模式,并且能够使其在web应用程序中工作。当手动将.config复制到temp文件夹时,应用程序可以工作,但是请看,我真的不喜欢手动复制到随机命名的文件夹

有没有办法阻止IIS使用临时文件夹,或者使其沿着配置文件进行复制?我认为我所面临的问题是与配置相关的,而不是概念性的,因为当配置文件就位时,应用程序会按预期工作。我也不想在配置文件中使用硬编码的物理路径


编辑:


为了更清楚,我将指出我想要实现的目标和原因。我们的想法是,库和web项目将作为单独的产品开发——库的配置中没有特定于用户或应用程序的信息,因此不会因不同的使用场景而改变。它还相当特定于类库功能,而不是最终应用程序。对我来说,将库的配置信息捆绑在其中是有意义的(类似于Java,在Java中,spring上下文xml文件或属性文件与库的jar捆绑在一起)。我希望避免在消费者应用程序的每个app/web配置中复制配置。在某些情况下,消费者应用程序是由第三方开发的,我不想依靠他们正确地配置我的产品。同样,这里唯一的问题是没有将配置文件复制到正确的位置。

简短的回答是:你不能。您必须合并两个配置部分,并将所有设置放在应用程序的主配置文件中。对于web应用程序,它将是
web.config
。阅读

我已经找到了解决所述问题的方法,但仍然不是很符合我的要求

解决方案是利用始终可用的应用程序配置(web应用程序中的web.config或app.config)。我为每个库添加了配置文件的绝对路径作为设置。因此,我最终得出以下结论:

<!--
THIS IS IN THE WEB.CONFIG FILE
-->
<appSettings>
    <add key ="ClassLibrary_ConfigPath"
         value ="{My Publish Output Folder}\ClassLibrary.dll.config"/>
</appSettings>

虽然这是可行的,但如果可能的话,我会等待更好的解决方案。尽管如此,我不必将整个ClassLibrary.dll.config复制到web.config文件中,但现在我必须管理文件系统位置并了解应用程序设置名称。我真正想要的是ClassLibrary.dll的消费者应用程序不以任何方式处理其配置。如果它是一个桌面应用程序,我已经介绍过了,因为Visual Studio会适当地复制ClassLibary.dll.config。我希望有一种方法可以让它在web应用程序中顺利运行

如果这些是静态的内部设置,任何人都不应该看到或更改,那么将类库中包含的配置文件作为嵌入式资源不是更好吗?或者只是一个带有设置的静态类


这样,您就可以确定没有人修改它,在您的场景中,这似乎是一个优点。

这就是.NET一直以来的工作方式。您需要复制类库配置文件中的设置,并将它们粘贴到web.config中。我明白了,但我相信我已经非常接近我需要实现的目标(请参阅我的重温文章,了解我的原因)。唯一的拦截器是临时文件夹中没有被IIS复制的文件。这正是我试图避免的——有关详细信息,请参阅我文章的重温。事实上,上面的代码正是我想要的方式,问题是temp asp.net文件中缺少配置太好了!我已经将配置文件标记为嵌入式资源(不再需要复制),我只是将其解压缩到temp文件夹,并使用
ConfigurationManager.OpenMappedExeConfiguration(exeConfigPath,…)
注意:一个重要的缺点是配置在程序集中编译,为了使更改生效,必须重建库,但目前我并不关心这一点。此外,