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

Учитывая, что у нас есть общая сборка, которая создает хост службы и т. Д. Поэтому мы должны использовать это, поэтому единственный способ продления тайм-аута, который я чувствую, - это использование поведения. Однако мне удалось заставить его работать с использованием атрибутов declrative. Мне пришлось переместить код в ApplyDispatchBehavior() в AddBindingParameters(). – Rubans

Смежные вопросы