2012-06-01 7 views
2

У меня есть обычный клиент сервиса 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

+0

Можете ли вы опубликовать метод 'this.FaultedHandler'/s? –

+0

Я обновил вопрос с кодом FaultedHandler. –

+0

Не могли бы вы теперь опубликовать свойство this.CommunicationObject? Это может быть проще, если вы можете опубликовать весь класс. –

ответ

1

После двух дней на войне против WCF Я нашел обходной путь.

Иногда WCF запускает Faulted событие, но иногда это не так. Однако событие Closed всегда запускается, особенно после вызова Abort().

Поэтому я звоню Abort() в FaultedHandler, который эффективно срабатывает Closed событие. Впоследствии, ClosedHandler выполняет повторное соединение. В случае, когда Faulted никогда не запускается каркасом, всегда запускается событие Closed.

BarServiceClient Create() 
{ 
    var duplexClient = new BarServiceClient(new InstanceContext(this.barServiceCallback)); 
    duplexClient.Faulted += this.FaultedHandler; 
    duplexClient.Closed += this.ClosedHandler; 
    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(); 
} 

void ClosedHandler(object sender, EventArgs ea) 
{ 
    this.CommunicationObject.Faulted -= this.FaultedHandler; 
    this.CommunicationObject.Closed -= this.ClosedHandler; 
    this.CommunicationObject = this.Create(); 
} 
}