Где .Net ищет мой файл конфигурации? - PullRequest
1 голос
/ 02 ноября 2010

У меня есть веб-сервис WCF ASP.Net 4.0, который мы назовем «WebService».WebService использует сборку библиотеки классов, которую мы назовем «WebServiceClassLibrary».WebServiceClassLibrary ссылается на другую сборку библиотеки классов ("ExternalClassLibrary").ExternalClassLibrary построен для использования файла конфигурации.Он использует этот файл, чтобы узнать, куда отправлять некоторые сообщения HTTP во время выполнения.У меня проблема, когда неважно, куда я помещаю раздел конфигурации для ExternalClassLibrary, он использует конфигурацию по умолчанию (такое поведение я ожидаю, когда не удается найти файл конфигурации во время выполнения).

Я ожидаю, что это означает, что когда .Net пытается найти конфигурацию для ExternalClassLibrary, он не может это сделать и использует информацию о конфигурации, найденную в скомпилированной сборке.Я попытался переопределить эту конфигурацию, поместив раздел конфигурации в файл web.config для WebService, создав файл конфигурации для ExternalClassLibrary и создав файл конфигурации для WebServiceClassLibrary.Даже если я пытаюсь переопределить конфигурацию в каждом из этих мест, она все равно заканчивается использованием конфигурации по умолчанию.Я размещаю сайт в IIS 7.

Может кто-нибудь сказать мне, как я могу определить, где мне нужно разместить эту основную информацию о конфигурации?Я пытался использовать Process Monitor SysInternals для просмотра неудачных попыток чтения файловой системы, но он показывает только два возможных места для переопределения конфигурации, и ни одно из них не помогло.

Оцените это!

- ОБНОВЛЕНИЕ, Вот содержимое файла 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 ]

2 голосов
/ 02 ноября 2010

Ваша ExternalClassLibrary должна загружать конфигурацию как

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

.Net ConfigManager по умолчанию загружает только конфигурацию основного процесса (exe.config / web.config), любая dll, использующая dll.config, должна загружаться явно.

1 голос
/ 03 ноября 2010

Правильный ответ (как сформулирован мой вопрос) на самом деле находится в самом вопросе

Я попытался переопределить эту конфигурацию, поместив раздел конфигурации в файл web.config ...

В .Net, когда сборка используется, каркас просматривает конфигурацию в файле конфигурации потребляющей сборки. Так что это ответ на вопрос. Именно здесь я научился размещать информацию о конфигурации для сборок в прошлом, но в этом случае мне показалось, что этот метод мне не удался.

Причина, по которой мне не повезло в этом случае с файлом web.config, переопределяющим конфигурацию по умолчанию, связана с ошибкой в ​​моем коде, когда при фактической попытке запроса значения в файле конфигурации я явно запрашивал "DefaultValue "который всегда будет тем, что находится в скомпилированной сборке.

Код был такой:

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

Я не осознавал, когда разрабатывал, что это будет так. Мне пришлось пробовать и допускать ошибки, чтобы получить значение при индексации в свойствах вместо стандартного строго типизированного метода чтения значений:

Properties.Settings.Default.ApiUrlRoot;

Это потому, что эта часть моего кода должна была динамически считывать значение из файла конфигурации. В зависимости от ситуации он будет читать другое значение из файла конфигурации. В конце приведем версию кода чтения динамической конфигурации, которая работает:

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