.Net在哪里寻找我的配置文件?

时间:2010-11-01 22:02:18

标签: .net wcf iis-7 configuration-files

我有一个WCF ASP.Net 4.0 Web服务,我们称之为“WebService”。 WebService正在使用我们称之为“WebServiceClassLibrary”的类库程序集。 WebServiceClassLibrary引用另一个类库程序集(“ExternalClassLibrary”)。 ExternalClassLibrary用于使用配置文件。它使用此文件来了解在运行时发送一些HTTP帖子的位置。我遇到了一个问题,无论我在哪里放置ExternalClassLibrary的配置部分,它似乎都在使用默认配置(当我在运行时找不到配置文件时,我会发现这种行为)。

我希望这意味着当.Net尝试查找ExternalClassLibrary的配置时,它无法执行此操作并使用已编译程序集中的配置信息。我试图通过在WebService的web.config文件中放置配置部分来覆盖此配置,方法是为ExternalClassLibrary创建配置文件并为WebServiceClassLibrary创建配置文件。即使我尝试覆盖每个位置的配置,它仍然使用默认配置。我在IIS 7中托管该网站。

有人可以告诉我如何确定我需要在哪里放置这些重要的配置信息?我曾尝试使用SysInternals的进程监视器来查看失败的文件系统读取尝试,但它只显示两个可能的地方来覆盖配置,而且它们都没有做到这一点。

欣赏它!

- UPDATE,这是我试图加载的XML文件的内容 -

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="MyAppName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <MyAppName.Properties.Settings>
            <setting name="APIURL" serializeAs="String">
                <value>http://servername/default.html</value>
            </setting>
            <setting name="APIAPPINI" serializeAs="String">
                <value>app.ini</value>
            </setting>
            <setting name="ApiUrlRoot" serializeAs="String">
                <value>https://www.domain.com/company[instance]test/index.htm</value>
            </setting>
            <setting name="ApiInstances" serializeAs="Xml">
                <value>
                    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <string>usa</string>
                        <string>eu</string>
                        <string>asia</string>
                        <string>lat</string>
                        <string>jpn</string>
                    </ArrayOfString>
                </value>
            </setting>
            <setting name="ApiKey" serializeAs="String">
                <value>password</value>
            </setting>
            <setting name="ApiUrlRoot" serializeAs="String">
                <value>http://site[instance].domain.com/</value>
            </setting>
            <setting name="ProductId" serializeAs="String">
                <value>12345</value>
            </setting>
        </MyAppName.Properties.Settings>
    </applicationSettings>
</configuration>

2 个答案:

答案 0 :(得分:2)

您的ExternalClassLibrary应该将配置加载为

ConfigurationManager.OpenExeConfiguration("ExternalClassLibrary.dll.config"); 

.Net ConfigManager默认只加载主进程配置(exe.config / web.config),任何使用dll.config的dll都应该显式加载。

答案 1 :(得分:1)

正确答案(正如我的问题所说)实际上是问题本身

  

我试图通过在配置部分中放置配置部分来覆盖此配置   web.config文件......

在.Net中使用程序集时,框架会查看使用程序集的配置文件中的配置。这就是问题的答案。这是我学习过去为程序集配置信息的地方,但在这种情况下,这种方法似乎让我失望。

我在这种情况下没有运气的原因是web.config文件覆盖了默认配置是由于我的代码中的一个错误,当我真正尝试在配置文件中请求值时我明确请求“DefaultValue” “这将始终是在编译的程序集中找到的。

代码是这样的:

Properties.Settings.Default.Properties["ApiUrlRoot"].DefaultValue;

我在开发过程中没有意识到情况就是这样。我不得不试验并错误地获取值,同时索引到Properties而不是标准的强类型方法来读取值:

Properties.Settings.Default.ApiUrlRoot;

这是因为我的代码部分必须动态地从配置文件中读取值。根据情况,它将从配置文件中读取不同的值。最后,这里是动态配置读取代码的版本:

Properties.Settings.Default.PropertyValues["ApiUrlRoot"].PropertyValue;