Проблема с проверкой соединения WCF открыта - PullRequest
2 голосов
/ 03 августа 2011

У меня проблема с проверкой соединения WCF открыто. Мой WCF Connection является двунаправленным. Я использую свойство State для проверки состояния соединения на клиенте. Моя функция:

private bool ConnectionIsOpen()
{
    if (m_Service != null && (m_Service.State | CommunicationState.Opened) == CommunicationState.Opened)
    {
        return true;
    }
    return false;
}

Я создаю службу, которая является потоком, работающим каждые 10 секунд для проверки состояния соединения. Я использую метод ConnectionIsOpen () для проверки. Все хорошо работает на Windows XP. Однако при работе в Windows 7 возникает проблема.

Когда я отсоединяю сетевой кабель, чтобы создать для отключения, Если запущено приложение в Windows XP, проверка состояния соединения не выполнена, но при запуске в Windows 7 проверка соединения «Состояние все еще открыто».

Любой может помочь мне, как проверить, открыто ли соединение или нет в этом случае. Спасибо.

Ответы [ 4 ]

4 голосов
/ 03 августа 2011

Это всегда будет true:

(m_Service.State | CommunicationState.Opened) == CommunicationState.Opened

Пример, m_Service.State = 0:

0 | CommuncationState.Opened == CommuncationState.Opened

Вместо этого вы хотите использовать & (AND).

3 голосов
/ 03 августа 2011

Мы столкнулись с подобной проблемой в нашей собственной системе; отключение сетевого кабеля или перевод клиентского компьютера или сервера в спящий режим не приводит к сбою канала.

Из того, что я могу сказать, кажется, что состояние соединения указывает только состояние соединения после последнего вызова, а не текущее состояние соединения. Единственный способ узнать текущее состояние - это вызвать службу.

Если вашему клиенту не требуется часто вызывать службу, но он должен реагировать в случае потери соединения, одним из решений является реализация фиктивного вызова на стороне клиента, который периодически опрашивает службу. Если соединение будет недоступно, когда будет сделан фиктивный вызов, вы получите ошибку канала, с которой вы можете разобраться.

Сложность в том, что вы не можете просто использовать фиктивный вызов, чтобы гарантировать, что следующий вызов сервису будет работать:

public void SomeMethode()
{
    if (ConnectionIsOpen())
    {
        m_Service.Dummy();
        // Connection is lost here
        m_Service.SomeMethode();
    }
}

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

2 голосов
/ 18 июня 2012

Лучший и подтвержденный способ подтверждения состояния связи - «Открыто» или «нет» - это вызвать событие Faults, как показано ниже:

 proxyInstance.InnerChannel.Faulted -= new EventHandler(ProxyChannelFaulted); 

Но это работает только с теми привязками, которые поддерживают ReliableMessaging, такими как WsHttpBinding.

Подробнее см. По ссылке: Прокси-клиент WCF, который тратит время на создание, любое решение для кеша или синглтона для него

Спасибо, Джай Кумар

0 голосов
/ 03 августа 2011

Тот факт, что вы получаете совершенно другие результаты в Windows 7, неудивителен. Microsoft полностью переработала стек TCP с Windows Vista, так что функциональность сильно отличается от xp в основной сетевой функциональности.

Первое, что я хотел бы сделать, это использовать wireshark, чтобы увидеть, что на самом деле происходит по проводу. Посмотрите, действительно ли ваше TCP-соединение прерывается, когда вы отключаете питание. Возможно, Windows выполняет какое-то постоянное / буферизированное соединение, если соединение быстро восстанавливается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...