2010-04-15 38 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