未正确应用服务行为

时间:2010-04-15 17:27:14

标签: c# wcf

我有一个服务的自定义行为,我想指定一个接收超时值,我已经创建了一个行为,并在构建服务标题上。

我使用声明属性来应用行为或者我认为。但是这种行为似乎没有区别,即设置的超时值没有按预期应用。

显式应用时的相同行为确实有效。 有什么想法吗?

行为:

[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
}

2 个答案:

答案 0 :(得分:0)

问题是您的行为运行得太晚了。到那时,绑定属性已经应用于通道侦听器,因此修改绑定不会对此产生任何影响。

我认为你不能(至少,我不记得在任何地方都可以看到)像这样动态地改变接收超时,因为大多数频道听众都是在这方面关闭的(即你不能改变他们的设置一旦打开)。

为什么需要像这样更改ReceiveTimeout?

答案 1 :(得分:0)

将ApplyDispatchBehavior()中的代码移动到AddBindingParameters()。