我有一个服务的自定义行为,我想指定一个接收超时值,我已经创建了一个行为,并在构建服务标题上。
我使用声明属性来应用行为或者我认为。但是这种行为似乎没有区别,即设置的超时值没有按预期应用。
显式应用时的相同行为确实有效。 有什么想法吗?
行为:
[AttributeUsage(AttributeTargets.Class)]
public class BuildServiceBindingBehavior : Attribute, IServiceBehavior
{
public BuildServiceBindingBehavior( string p_receiveTime )
{
ReceiveTimeout = TimeSpan.Parse( p_receiveTime );
}
#region IServiceBehavior Members
public void AddBindingParameters( ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters )
{
}
public void ApplyDispatchBehavior( ServiceDescription serviceDescription, ServiceHostBase serviceHostBase )
{
// add this behavior to each endpoint
foreach ( var endPoint in serviceDescription.Endpoints )
{
endPoint.Binding.ReceiveTimeout = ReceiveTimeout;
}
}
public void Validate( ServiceDescription serviceDescription, ServiceHostBase serviceHostBase )
{
}
#endregion
internal TimeSpan ReceiveTimeout { get; set; }
}
服务代码:
[ServiceBehavior(Name = "DotNetBuildsService",
InstanceContextMode = InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Single
)]
// Set receieve time out
[BuildServiceBindingBehavior( "0:0:1" )]
public class BuildService : IBuildTasksService
{
//implementation code
}
答案 0 :(得分:0)
问题是您的行为运行得太晚了。到那时,绑定属性已经应用于通道侦听器,因此修改绑定不会对此产生任何影响。
我认为你不能(至少,我不记得在任何地方都可以看到)像这样动态地改变接收超时,因为大多数频道听众都是在这方面关闭的(即你不能改变他们的设置一旦打开)。
为什么需要像这样更改ReceiveTimeout?
答案 1 :(得分:0)
将ApplyDispatchBehavior()中的代码移动到AddBindingParameters()。