1

カスタムBehaviorExtensionElementを介して構成する拡張機能を備えたワークフローサービスがあります。アプリケーションの他の部分でもいくつかの構成プロパティを再利用する必要があるため、ConfigurationManagerを介して構成要素を読み取る方法を知りたいと思います。

public class ServiceConfigurationElement : BehaviorExtensionElement
{
    public const string RetryDelayKey = "retryDelay";

    /// <summary>
    /// Creates a behavior extension based on the current configuration settings.
    /// </summary>
    /// <returns>
    /// The behavior extension.
    /// </returns>
    protected override object CreateBehavior()
    {
        var behavior = new ServiceConfigurationBehavior
            {
                RetryDelay = this.CommsRetryDelay
            };
        return behavior;
    }

    /// <summary>
    /// Gets the type of behavior.
    /// </summary>
    /// <returns>
    /// A <see cref="T:System.Type"/>.
    /// </returns>
    public override Type BehaviorType
    {
        get
        {
            return typeof(ServiceConfigurationBehavior);
        }
    }

    [ConfigurationProperty(RetryDelayKey, IsKey = false, DefaultValue = true)]
    public TimeSpan RetryDelay
    {
        get

        {
            return (TimeSpan)this[RetryDelayKey];
        }

        set
        {
            this[RetryDelayKey] = value;
        }
    }
}

そして構成:

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <serviceConfiguration retryDelay="00:01:00" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <extensions>
        <behaviorExtensions>
            <add name="serviceConfiguration" type="MyNamespace.ConfigurationElement, MyAssembly"/>
        </behaviorExtensions>
    </extensions>
</system.serviceModel>

ConfigurationManagerを介してRetryDelayプロパティ(およびもちろん他のプロパティ)を読み取るにはどうすればよいですか?

ありがとう

フランチェスコ

4

1 に答える 1

3

ConfigurationManagerには、ServiceModelセクションのプロパティが明示的にありません。代わりに、MicrosoftはServiceModelSectionGroup(MSDN)を提供しました。これにより、そのセクションを取得して値を読み取ることができます。

まず、ConfigurationManager( MSDN )で構成ファイルを開くためのさまざまな方法を使用して構成ファイルをロードする必要があります。以下では、OpenMappedExeConfigurationメソッドを使用します。

ExeConfigurationFileMap exeConfigurationFileMap = new ExeConfigurationFileMap
{
    ExeConfigFilename = Assembly.GetEntryAssembly().Location + ".config"
};
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration( exeConfigurationFileMap, ConfigurationUserLevel.None );

その後、次の手順でセクションを取得する必要があります。

ServiceModelSectionGroup serviceModelGroup = ServiceModelSectionGroup.GetSectionGroup( configuration );

そこから、任意のサービスモデル構成値にアクセスできます。例として、動作を次のように変更します。名前付きの動作に注意してください。

<behavior name="Configuration">
    <serviceConfiguration retryDelay="00:01:00" />
</behavior>

セクショングループを作成したら、動作拡張機能を取得して、それらを反復処理するだけです。

ServiceBehaviorElementCollection serviceBehaviors = serviceModelGroup.Behaviors.ServiceBehaviors;

foreach ( ServiceBehaviorElement behavior in serviceBehaviors )
{
    if ( behavior.Name == "Configuration" )
    {
        ServiceConfigurationElement serviceConfiguration = behavior[ typeof( ServiceConfigurationElement ) ] as ServiceConfigurationElement;
        Console.WriteLine( serviceConfiguration.RetryDelay.ToString() );
        // do whatever you like here
    }
}

ServiceBehaviorsを使用したことがわかりますが、EndpointBehaviorsには別のプロパティもあります。これを拡張する1つの方法は、サービスモデルセクショングループを静的変数(ディスクI / Oが少ない)にキャッシュし、将来作成する可能性のある拡張機能のさまざまな属性を照会するためのいくつかのメソッドを作成することです。

お役に立てれば!

于 2012-09-17T12:55:03.083 に答える