У меня есть обычный клиент сервиса WCF WC.tcp и обычный net.tcp duplex (т. Е. С обратным вызовом) клиент службы WCF. Я реализовал некоторую логику, чтобы постоянно восстанавливать соединение в случае сбоя службы.Дуплексный канал Неверное событие не растет при попытке второго соединения
Они созданы в точно таким же образом:
FooServiceClient Create()
{
var client = new FooServiceClient(ChannelBinding);
client.Faulted += this.FaultedHandler;
client.Ping(); // An empty service function to make sure connection is OK
return client;
}
BarServiceClient Create()
{
var duplexClient = new BarServiceClient(new InstanceContext(this.barServiceCallback));
duplexClient.Faulted += this.FaultedHandler;
duplexClient.Ping(); // An empty service function to make sure connection is OK
return duplexClient;
}
public class Watcher
{
public Watcher()
{
this.CommunicationObject = this.Create();
}
ICommunicationObject CommunicationObject { get; private set; }
void FaultedHandler(object sender, EventArgs ea)
{
this.CommunicationObject.Abort();
this.CommunicationObject.Faulted -= this.FaultedHandler;
this.CommunicationObject = this.Create();
}
}
FaultedHandler()
ликвидирует канал и воссоздает его, используя код, приведенный выше.
Пересоединительная логика FooServiceClient
работает нормально, она повторно подключается после многих сбоев. Принимая во внимание, что почти то же самое, но дуплекс BarServiceClient
получает событие Faulted только с первого экземпляра BarServiceClient
, т. Е. один раз.
Почему только первый экземпляр дуплекса BarServiceClient
получает ошибку? Есть ли обходные пути?
Похожая не ответил на вопрос: WCF Reliable session without transport security will not faulted event on time
Можете ли вы опубликовать метод 'this.FaultedHandler'/s? –
Я обновил вопрос с кодом FaultedHandler. –
Не могли бы вы теперь опубликовать свойство this.CommunicationObject? Это может быть проще, если вы можете опубликовать весь класс. –