Как проверить, прекращен ли клиентский канал WCF (услуга) или нет? - PullRequest
1 голос
/ 07 июля 2011

У меня есть простая служба WCF, размещенная в службе Windows.

Когда клиент службы wcf простаивает в течение 10 минут или более, служба WCF прекращается на стороне клиента [не на стороне сервера, служба сервера все еще активна], и я получил ошибку истечения времени ожидания.

Я не хочу увеличивать время ожидания. Я просто хотел знать, есть ли изящный способ узнать, завершен ли сервис или нет на стороне клиента? [Предоставляет ли API эту информацию?] Затем, если сеанс завершен, я создам новый.

С наилучшими пожеланиями

Ps: на стороне клиента я проверил WCFClientChannel->Sate == CommunicationState::Faulted, и это не сработало

1 Ответ

1 голос
/ 16 июля 2011

К сожалению, единственный способ узнать, что прокси больше не используется, это попытаться использовать его.

На самом деле вы используете привязку, сессионную (скажем, NetTcpBinding или WSHttpBinding), для которой служба поддерживает ресурсы для клиентского соединения. Если клиент не общается со службой в течение времени, указанного в параметре receiveTimeout службы (по умолчанию 10 минут), сервер решает, что клиент не возвращается, и выбрасывает ресурсы на стороне сервера клиента.

Теперь, когда клиент возвращается и говорит: «Привет, это снова я», сервер говорит: «Я понятия не имею, о чем вы говорите» и сбивает вызов, тем самым убивая прокси клиента

Следовательно, поскольку решение было принято на стороне сервера, клиент не узнает об этом, пока не попытается связаться со службой

Вы можете сделать одно из следующих действий:

  1. увеличить receiveTimeout на сервере (но это только делает его займет больше времени, чтобы увидеть проблему)
  2. использовать привязку, которая не является сессионной (скажем, BasicHttpBinding)
  3. есть операция ping, которая вызывается клиентом каждые минут, чтобы служба знала, что она все еще там
...