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

希望这可以帮助!

于 2012-09-17T12:55:03.083 回答