Как мне обработать исключение, сгенерированное в методе обратного вызова на клиенте в настройке дуплекса WCF?
В настоящее время клиент, по-видимому, не вызывает событие с ошибкой (разве я неправильно его отслеживаю?), Но любой последующий вызов Ping () с использованием клиента завершается с ошибкой CommunicationException: «Объект связи, System.ServiceModel. Channels.ServiceChannel, нельзя использовать для связи, поскольку оно было прервано. ".
Как мне справиться с этим и воссоздать клиента и т. Д.? Мой первый вопрос: как узнать, когда это произойдет? Во-вторых, как лучше с этим бороться?
Мои контракты на обслуживание и обратный вызов:
[ServiceContract(CallbackContract = typeof(ICallback), SessionMode = SessionMode.Required)]
public interface IService
{
[OperationContract]
bool Ping();
}
public interface ICallback
{
[OperationContract(IsOneWay = true)]
void Pong();
}
Реализация моего сервера:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class Service : IService
{
public bool Ping()
{
var remoteMachine = OperationContext.Current.GetCallbackChannel<ICallback>();
remoteMachine.Pong();
}
}
Моя клиентская реализация:
[CallbackBehavior(UseSynchronizationContext = false, ConcurrencyMode = ConcurrencyMode.Single)]
public class Client : ICallback
{
public Client ()
{
var context = new InstanceContext(this);
var proxy = new WcfDuplexProxy<IApplicationService>(context);
(proxy as ICommunicationObject).Faulted += new EventHandler(proxy_Faulted);
//First Ping will call the Pong callback. The exception is thrown
proxy.ServiceChannel.Ping();
//Second Ping call fails as the client is in Aborted state
try
{
proxy.ServiceChannel.Ping();
}
catch (Exception)
{
//CommunicationException here
throw;
}
}
void Pong()
{
throw new Exception();
}
//These event handlers never get called
void proxy_Faulted(object sender, EventArgs e)
{
Console.WriteLine("client faulted proxy_Faulted");
}
}