У меня есть обычное поведение для службы, где я хочу указать значение тайм-аута приема, я создал поведение и заголовок службы сборки.Правильное поведение службы
Я использую декларативный атрибут для применения поведения или, как я думал. Но поведение, по-видимому, не имеет значения, то есть заданное значение таймаута не применяется, как ожидалось.
Такое же поведение, когда оно применяется явно, работает. Любые идеи?
Поведение:
[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
}
Учитывая, что у нас есть общая сборка, которая создает хост службы и т. Д. Поэтому мы должны использовать это, поэтому единственный способ продления тайм-аута, который я чувствую, - это использование поведения. Однако мне удалось заставить его работать с использованием атрибутов declrative. Мне пришлось переместить код в ApplyDispatchBehavior() в AddBindingParameters(). – Rubans