2010-04-15 92 views
0

我有一个服务的自定义行为,我想指定一个接收超时值,我已经创建了一个行为,并在构建服务头。服务行为没有正确应用

我使用声明性属性来应用行为或按照我的想法。但是这种行为似乎没有什么区别,即设置的超时值没有如预期那样得到应用。

通过明确应用时的相同行为确实有效。 任何想法?

行为:

[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

移动在ApplyDispatchBehavior()中的代码,以AddBindingParameters()。

0

的问题是,你的行为运行为时已晚。到那时,绑定属性已经应用到通道监听器,所以修改绑定不会在那里产生任何效果。

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

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

+0

Withing公司,我们有一个共同的组件创建服务主机等,所以,我们必须使用这一点,所以延长了超时的唯一方法正确,我觉得使用行为。 但是我设法使用declrative属性来使它工作。我不得不将ApplyDispatchBehavior()中的代码移动到AddBindingParameters()。 – Rubans 2010-04-16 09:58:50