20

いくつかの Azure ヘルパー クラスを含むライブラリがあります。これらのヘルパー クラス内で、Azure アカウント名やキーなどの設定を取得します。Azure で実行する場合、これらの設定はクラウド構成ファイル (cscfg) から取得されます。これはすべてうまくいきます。

これらのクラスを Azure の外部 (具体的には RoleEnvironment) で単体テストするために、単体テスト プロジェクト内で同じ変数名の設定を作成しました。これらは実際には app.config ファイル内に保存され、テスト プロジェクトのプロパティ セクションの下にある設定セクションで編集されます。web.config/app.config 設定からクラウド構成設定を抽象化する独自の方法を作成するのではなく、CloudConfigurationManager クラスを使用することにしました。ただし、単体テストを実行すると、設定がまったく反映されないため、null が返されます。ただし、以下の「appSettings」形式の設定を使用するように app.config ファイルを変更すると、有効な値が得られます。これの欠点は、Visual Studio 内の設定エディター ページを使用して設定を編集できなくなったことです。

だから私の質問は、私が何か間違ったことをしているのですか、それともクラウド構成マネージャーの制限ですか?

<appSettings>
    <add key="Foo" value="MySettingValue"/>
</appSettings>

上記は機能しますが、以下は機能しません。

<applicationSettings>
    <ComponentsTest.Properties.Settings>
      <setting name="Foo" serializeAs="String">
        <value>MySettingValue</value>
      </setting>
    </ComponentsTest.Properties.Settings>  
</applicationSettings>
4

1 に答える 1

34

CloudConfigurationManager は、web.config/app.config のAppSettings部分のみをサポートし、設定が Azure 構成にない場合、ここから値を読み取ろうとします。ドキュメントには、プロパティ RoleEnvironment.IsAvailable がtrue (Azure で実行)の場合、web.config/app.config を読み取らないと記載されていますが、以下のソース コードでわかるように、これは正しくありません (IsAvailable のチェックなし)。 .

ソースを見て、何が起こるかを確認できます。

    /// <summary>
    /// Gets a setting with the given name.
    /// </summary>
    /// <param name="name">Setting name.</param>
    /// <returns>Setting value or null if such setting does not exist.</returns>
    internal string GetSetting(string name)
    {
        Debug.Assert(!string.IsNullOrEmpty(name));

        string value = null;

        value = GetValue("ServiceRuntime", name, GetServiceRuntimeSetting);
        if (value == null)
        {
            value = GetValue("ConfigurationManager", name, n => ConfigurationManager.AppSettings[n]);
        }

        return value;
    }

ご覧のとおり、 AppSettingsにアクセスするだけの通常のConfigurationManagerクラスへの呼び出しは 1 つだけです。

于 2012-07-23T11:30:02.967 に答える