Я бы порекомендовал вам использовать IAsyncResult.Когда вы генерируете прокси WCF на клиенте и получаете асинхронные вызовы, вы должны получить метод TopicServiceClient.BeginGetAllTopics ().Этот метод возвращает объект IAsyncResult.Для завершения вызова также требуется делегат AsyncCallback.Когда он завершается, вы вызываете EndGetAllTopics (), предоставляя IASyncResult (переданный EndGetAllTopics ().
Вы помещаете попытку / ловушку вокруг вашего вызова в BeginGetAllTopics (), и это должно перехватить исключение, которое вы после.исключение происходит удаленно, т. е. вы действительно подключаетесь, но служба выдает исключение, которое обрабатывается в точке, где вы вызываете EndGetAllTopics ().
Вот действительно простой пример (явно не производственный)чтобы продемонстрировать то, что я говорю. Это было написано в WCF 4.0.
namespace WcfClient
{
class Program
{
static IAsyncResult ar;
static Service1Client client;
static void Main(string[] args)
{
client = new Service1Client();
try
{
ar = client.BeginGetData(2, new AsyncCallback(myCallback), null);
ar.AsyncWaitHandle.WaitOne();
ar = client.BeginGetDataUsingDataContract(null, new AsyncCallback(myCallbackContract), null);
ar.AsyncWaitHandle.WaitOne();
}
catch (Exception ex1)
{
Console.WriteLine("{0}", ex1.Message);
}
Console.ReadLine();
}
static void myCallback(IAsyncResult arDone)
{
Console.WriteLine("{0}", client.EndGetData(arDone));
}
static void myCallbackContract(IAsyncResult arDone)
{
try
{
Console.WriteLine("{0}", client.EndGetDataUsingDataContract(arDone).ToString());
}
catch (Exception ex)
{
Console.WriteLine("{0}", ex.Message);
}
}
}
}
Чтобы исключение на стороне сервера распространялось обратно на клиент, вам необходимо установить следующее в веб-конфигурации сервера ...
<serviceDebug includeExceptionDetailInFaults="true"/>