Мы столкнулись с подобной проблемой в нашей собственной системе; отключение сетевого кабеля или перевод клиентского компьютера или сервера в спящий режим не приводит к сбою канала.
Из того, что я могу сказать, кажется, что состояние соединения указывает только состояние соединения после последнего вызова, а не текущее состояние соединения. Единственный способ узнать текущее состояние - это вызвать службу.
Если вашему клиенту не требуется часто вызывать службу, но он должен реагировать в случае потери соединения, одним из решений является реализация фиктивного вызова на стороне клиента, который периодически опрашивает службу. Если соединение будет недоступно, когда будет сделан фиктивный вызов, вы получите ошибку канала, с которой вы можете разобраться.
Сложность в том, что вы не можете просто использовать фиктивный вызов, чтобы гарантировать, что следующий вызов сервису будет работать:
public void SomeMethode()
{
if (ConnectionIsOpen())
{
m_Service.Dummy();
// Connection is lost here
m_Service.SomeMethode();
}
}
Чтобы обойти эту проблему, мы внедрили систему, которая автоматически повторно выполняет все неудачные вызовы службы, которые генерируют сбой канала после восстановления соединения.