Нет. Это неправильно понимают, и, к сожалению, существует много дезинформации.
Во-первых, «Бесконечное» — это своего рода полудействительное значение. Существует два специальных сериализатора конфигурации, которые преобразуют «Infinite» либо в TimeSpan.MaxValue
, либо в int.MaxValue
(так что в любом случае они на самом деле не «бесконечны»), но, похоже, не все в WCF распознает это. Поэтому всегда лучше явно указывать тайм-ауты со значениями времени.
Во-вторых, вам не нужен метод «keepalive» в вашей службе, так как WCF обеспечивает так называемый «надежный сеанс». Если вы добавите <reliableSession enabled="true" />
, тогда WCF предоставит собственный механизм поддержания активности через «сообщения инфраструктуры».
Имея свой собственный механизм «keepalive», вы фактически удваиваете нагрузку на свой сервис и фактически можете создать больше проблем, чем решить.
В-третьих, при использовании надежного сеанса вы используете настройку inactivityTimeout
для reliableSession
. Это делает две вещи. Во-первых, он контролирует, как часто отправляются сообщения инфраструктуры (keepalive). Они отправляются с половиной значения времени ожидания, поэтому, если вы установите его на 18 минут, они будут отправляться каждые 9 минут. Во-вторых, если в течение тайм-аута бездействия не получены никакие инфраструктурные или операционные сообщения (т. е. сообщения, которые являются частью вашего контракта на передачу данных), соединение прерывается, потому что, вероятно, возникла проблема (сбой на одной стороне, проблема с сетью и т. д.). .).
receiveTimeout
— это максимальное время, в течение которого не может быть получено ни одного сообщения о работе, прежде чем соединение будет прервано (по умолчанию — 10 минут). Установка этого значения на большое значение (Int32.MaxValue
где-то около 24 дней) поддерживает подключение, устанавливая inactivityTimeout на меньшее значение (опять же, по умолчанию 10 минут) (на время, которое меньше, чем 2x максимальное количество времени до того, как сетевые маршрутизаторы разорвут соединение из-за неактивности) сохраняет соединение активным.
WCF обрабатывает все это за вас. Затем вы можете просто подписаться на сообщения «Соединение прервано», чтобы знать, когда соединение прерывается по реальным причинам (сбои приложений, тайм-ауты сети, отключение питания клиентов и т. д.), и позволяет вам воссоздать соединения.
Кроме того, если вам не нужны упорядоченные сообщения, установите ordered="false"
, так как это значительно снижает нагрузку на надежные сеансы. Значение по умолчанию верно.
Примечание. Вы можете не получить сообщение о разрыве соединения, пока не истечет время ожидания inactivityTimeout (или пока вы не попытаетесь использовать соединение). Помните об этом и соответственно устанавливайте тайм-ауты.
Большинство рекомендаций в Интернете — установить для ReceiveTimeout и inactivityTimeout значение Infinite. У этого есть две проблемы: во-первых, сообщения инфраструктуры не отправляются своевременно, поэтому маршрутизаторы разрывают соединение... заставляя вас выполнять свои собственные проверки активности. Во-вторых, большой тайм-аут бездействия означает, что он не распознает, когда соединение законно разрывается, и вы должны полагаться на прерывание этого пинга, чтобы узнать, когда произойдет сбой. Все это совершенно не нужно и может даже сделать ваш сервис еще более ненадежным.
См. также это: Как правильно настроить Надежный дуплексный сеанс WCF NetTcp?
person
Erik Funkenbusch
schedule
04.11.2014