Ошибки надежного сеанса WCF независимо от настроенных тайм-аутов

Я пытаюсь использовать надежный сеанс WCF, чтобы включить обратные вызовы от службы к клиенту. Этот канал обратного вызова должен быть открыт на неопределенный срок.

Кажется, в некоторых версиях .NET есть ошибка, которая позволяет преждевременный сбой надежных сеансов. Не должно быть проблем, просто установите для inactivityTimeout и ReceiveTimeout достаточно высокие значения (например, TimeSpan.MaxValue).

Но независимо от того, как я настраиваю свой клиент и службы, канал все равно дает сбой через 10 минут, независимо от значения, которое я установил в качестве тайм-аута.

Этот вопрос был бы неполным без моего конфига, так что вот оно:

<!-- service's app.config -->
<!-- irrelevant stuff snipped .. -->
</binding>
  <netTcpBinding>
    <!-- enable reliable sessions, set timeouts to their maximum possible value!!! -->
    <binding name="netTcpReliable" receiveTimeout="infinite">
      <reliableSession enabled="true" inactivityTimeout="infinite"/>
    </binding>
  </netTcpBinding>
</binding>

<services>
  <service name="SomeService" behaviorConfiguration="metadataBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:port/SomeService"/>
      </baseAddresses>
    </host>
    <endpoint name="SomeService_BasicTcpEndpoint"
              address="service"
              binding="netTcpBinding"
              bindingConfiguration="netTcpReliable"
              contract="ISomeService" />
  </service>
<services>

// client's binding generation code
var binding = new NetTcpBinding(SecurityMode.Transport, true) // enable reliable session
{
    OpenTimeout = openCloseTimeout,
    CloseTimeout = openCloseTimeout,
    SendTimeout = sendTimeout,
    ReceiveTimeout = TimeSpan.MaxValue // maximum possible value (infinite in app.config)
};

binding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue; // maximum possible value (infinite in app.config)

var factory = new ChannelFactory<TChannel>(binding);
return factory.CreateChannel(endpointAddress);

Итак, как вы можете видеть, все тайм-ауты настроены на значения выше 10 минут, и все равно канал дает сбой ровно через 10 минут без какого-либо обращения в службу поддержки. Как я могу обойти это? Насколько я понял, надежные сеансы (среди прочего) используются именно для этого: поддержания работоспособности каналов и предотвращения их сбоев (путем отправки пакетов поддержки активности инфраструктуры — по крайней мере, в последних версиях .NET без вышеупомянутая ошибка).


person knittl    schedule 28.11.2013    source источник
comment
Я понимаю, что этому почти год... но вы установили это значение как на клиенте, так и на сервере?   -  person Erik Funkenbusch    schedule 14.10.2014


Ответы (1)


Вы должны были получить предупреждения во время компиляции о том, что бесконечность не является допустимым значением для тайм-аутов. Максимальный тайм-аут составляет около 24 дней.

person Volker    schedule 01.02.2014
comment
Технически, существует специальный сериализатор конфигурации, который интерпретирует бесконечность как TimeSpan.MaxValue, но даже в этом случае он все равно переопределяет значения в коде с помощью MaxValue, поэтому ваш комментарий не совсем полезен. - person Erik Funkenbusch; 14.10.2014