Мы используем блок EnterpriseLibrary ConnectionMonitor, который работает достаточно хорошо, с его помощью вы можете определить свою собственную стратегию для определения доступности соединения, но мы просто используем тот, который входит в комплект поставки.
Этот код по умолчанию (который выполняется в фоновом потоке ... обрабатывается блоком) использует это внутренне:
public bool IsAlive(string hostnameOrAddress)
{
bool alive = false;
try
{
Uri address = new Uri(hostnameOrAddress);
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(address);
request.Timeout = 5000;
using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
{
alive = DoesResponseStatusCodeIndicateOnlineStatus(response);
}
}
catch (WebException wex)
{
alive = DoesWebExceptionStatusIndicateOnlineStatus(wex);
}
return alive;
}
Посмотрите на сам блок, посмотрите, сможете ли вы использовать его в своем проекте, или получите некоторые идеи о том, как решить вашу конкретную проблему. (из памяти блок является частью SCSF Smart Client Software Factory)
Однако я понимаю, что вам понадобится выполнить какую-то фоновую работу или подождать тайм-аут самостоятельно. WCF не знает, что конечная точка не существует, пока не истечет время ожидания вызова.