1

ConfigurationManager には AppSettings の名前と値のコレクションがありますが、CloudConfigurationManager には GetSetting(string) メソッドしかなく、キーがわかっていれば構成設定を 1 つずつ取得できます。

ロール ランタイムの構成全体を取得する方法はありますか?

根本的な原因は、それを抽象化し、コードをよりテストしやすくするために、厳密に型指定された構成を作成したいということです。CloudConfigurationManager を直接使用することは、テストでスタブしたい抽象化で削除したい暗黙の依存関係です。だから私はこれが実用的だと思います。それが私の質問につながります。

基本クラスの継承が必要なため、その依存関係を完全に保持する必要があるため、fx.configuration.azure のようなライブラリは使用したくありません。

4

2 に答える 2

1

私の知る限り、この情報を提供する直接的な方法はありません。

ただし、使用できる回避策があります。これには、Service Management API のGet Deployment操作を利用することが含まれます。この操作は、XML とConfiguration、Base64 エンコード形式のサービス構成ファイルを含む要素の 1 つを返します。この要素を読み取って文字列に変換し、XML を解析してConfigurationSettings要素を取得できます。その子要素にはすべての設定が含まれています。

このために、Service Management REST API で独自のラッパーを作成するか、Azure Management Library.

アップデート

Service Configuration Fileを使用してすべての構成設定を一覧表示するサンプル コードを次に示しますAzure Management Library。これは、非常に短い時間で一緒にハッキングされたシンプルなコンソールアプリであるため、多くの改善の余地があります:)。管理証明書には、発行設定ファイルのデータを使用しました。

Azure Management Libraryコンソール アプリケーションに Nuget パッケージをインストールするだけです。

インストール パッケージ Microsoft.WindowsAzure.Management.Libraries

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Management.Compute;
using System.Security.Cryptography.X509Certificates;
using System.Xml.Linq;

namespace ReadConfigurationSettingsUsingAzureManagementLibrary
{
    class Program
    {
        static string subscriptionId = "<subscription-id>";
        static string managementCertContents = "<Base64 Encoded Management Certificate String from Publish Setting File>";//Certificate string from Azure Publish Settings file
        static string cloudServiceName = "<your cloud service name>";
        static string ns = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration";
        static void Main(string[] args)
        {
            var managementCetificate = new X509Certificate2(Convert.FromBase64String(managementCertContents));
            var credentials = new CertificateCloudCredentials(subscriptionId, managementCetificate);

            var computeManagementClient = new ComputeManagementClient(credentials);
            var response = computeManagementClient.HostedServices.GetDetailed(cloudServiceName);
            var deployment = response.Deployments.FirstOrDefault(d => d.DeploymentSlot == Microsoft.WindowsAzure.Management.Compute.Models.DeploymentSlot.Production);
            if (deployment != null)
            {
                var config = deployment.Configuration;
                XElement configXml = XElement.Parse(config);
                var roles = configXml.Descendants(XName.Get("Role", ns));
                foreach (var role in roles)
                {
                    Console.WriteLine(role.Attribute("name").Value);
                    Console.WriteLine("-----------------------------");
                    var configurationSettings = role.Element(XName.Get("ConfigurationSettings", ns));
                    foreach (var element in configurationSettings.Elements(XName.Get("Setting", ns)))
                    {
                        var settingName = element.Attribute("name").Value;
                        var settingValue = element.Attribute("value").Value;
                        Console.WriteLine(string.Format("{0} = {1}", settingName, settingValue));
                    }
                    Console.WriteLine("==========================================");
                }
            }
            Console.ReadLine();
        }
    }
}
于 2015-06-25T15:48:47.007 に答える