我有一个工作流服务,其扩展名是通过自定义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属性(当然还有其他属性)?
由于
弗朗西斯
答案 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较少)中,并编写一些方法来查询将来可能编写的任何扩展的各种属性。
希望这有帮助!