WCF Коммуникационный Хост / Клиент. Нет реакции на ошибки соединения
Я использовал этот пример для своего wcf-сервиса: http://www.codeproject.com/KB/IP/WCFWPFChatRoot.aspx?msg=3713905
Но если сервер останавливается, клиенты не получают его...
Пример обработал это с:
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 ответ
Проблема заключается в базовом протоколе TCP. Когда соединение неожиданно умирает, TCP не будет немедленно информировать другую сторону. Обычно есть тайм-ауты в диапазоне часов, которые вы можете в конечном итоге настроить в используемом стеке TCP - в вашем случае где-то в реестре Windows. Но я бы не советовал, потому что это влияет на всю вашу машину.
Но вы получите сообщение об ошибке при попытке отправить данные по этому несуществующему соединению в следующий раз.
Поэтому, если вы хотите знать, живо ли ваше соединение или нет, вы должны отправлять небольшое сообщение через регулярные промежутки времени.