通过配置设置访问BehaviorExtensionElement

时间:2012-09-01 18:27:42

标签: wcf configuration workflow-foundation

我有一个工作流服务,其扩展名是通过自定义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属性(当然还有其他属性)?

由于

弗朗西斯

1 个答案:

答案 0 :(得分: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还有另一个属性。扩展此方法的一种方法是将服务模型节组缓存在静态变量(磁盘I / O较少)中,并编写一些方法来查询将来可能编写的任何扩展的各种属性。

希望这有帮助!