WCF Communication Host / Client. Нет реакции на ошибки соединения - PullRequest
2 голосов
/ 29 декабря 2010

я использовал этот пример для моего wcf-сервиса: http://www.codeproject.com/KB/IP/WCFWPFChatRoot.aspx?msg=3713905#xx3713905xx

Но если сервер останавливается, клиенты не получают его ...

Пример обработал это с помощью:

proxy.Open();

proxy.InnerDuplexChannel.Faulted += 
  new EventHandler(InnerDuplexChannel_Faulted);
proxy.InnerDuplexChannel.Opened += 
  new EventHandler(InnerDuplexChannel_Opened);
proxy.InnerDuplexChannel.Closed += 
  new EventHandler(InnerDuplexChannel_Closed);

void InnerDuplexChannel_Closed(object sender, EventArgs e)
{
    if (!this.Dispatcher.CheckAccess())
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
                        new FaultedInvoker(HandleProxy));
        return;
    }
    HandleProxy();
}


void InnerDuplexChannel_Faulted(object sender, EventArgs e)
{
    if (!this.Dispatcher.CheckAccess())
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
                        new FaultedInvoker(HandleProxy));
        return;
    }
    HandleProxy();
}

Но если я остановлю хост или он выйдет из строя (ALT + F4), клиенты не получат его. Состояние соединения все еще «подключено».

1 Ответ

2 голосов
/ 29 декабря 2010

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

Но вы получите сообщение об ошибке при попытке отправить данные по этому несуществующему соединению в следующий раз.

Так что, если вы хотите знать, живо ли ваше соединение или нет, вы должны отправлять небольшое сообщение через регулярные промежутки времени.

...