WCF wsDualHttpBinding прекратить отправку обратных вызовов

Я разрабатываю сервис WCF, который связан с весами. Мы хотели бы отправлять сообщения всем подключенным клиентам при изменении веса. С одними весами может быть подключен только один клиент, поэтому я разработал WCF, который общается с клиентами с помощью wsDualHttpBinding и обратных вызовов.

Это решение работает, но через долгое время (1-2 дня) служба WCF перестает отправлять обратные вызовы. Я знаю, что моя служба работает, потому что у меня есть регистратор, но мои клиенты не получают обратных вызовов. Мой сервис также не генерирует исключений.

Это мой сервисный псевдокод

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.PerSession)]
public sealed class WeightbridgeService : IWeightbridgeService, IDisposable


 public WeightbridgeService()
 {
        this.callback = OperationContext.Current.GetCallbackChannel<IWeightbridgeServiceCallback>();
        weighbridge.WeightChanged += WeightChangedEventHandler;
        timer.Elapsed += TimerOnElapsed;
        timer.Start();
 }

 private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
 {
            timer.Stop();
            this.callback.SendWeightData(this.weightData);
            timer.Start();
 }

и конфигурация

 <bindings>
      <wsDualHttpBinding>
        <binding name="longTimeoutBinding" receiveTimeout="00:45:00" sendTimeout="00:45:00" openTimeout="00:45:00" closeTimeout="00:45:00" >
          <reliableSession inactivityTimeout="00:45:00" />
          <security mode="None"/>
        </binding>
      </wsDualHttpBinding>
    </bindings>

Не могли бы вы помочь мне, что я сделал неправильно? Я не могу найти решение для него.


person user2811005    schedule 28.04.2016    source источник


Ответы (1)


Вы можете добавить атрибут receiveTimeout к своей привязке в файле конфигурации SERVICE. Хотя его имя — receiveTimeout, это значение (количество времени), используемое сервером для закрытия соединений для «неактивных» клиентов.

Пример:

<binding name="wsDualHttpBinding" 
             closeTimeout="00:01:00" 
             openTimeout="00:01:00" 
             receiveTimeout="02:00:00"> <-- this is the amount of time to wait before droppin client connection
person Secret Squirrel    schedule 07.02.2017