Я сталкивался с этой проблемой раньше в своих дуплексных службах, когда событие, возникшее со стороны сервера, возникло исключение, если между клиентом и сервером не было живого канала, поэтому сервер перешел в состояние Fault
и все последующие запросы не будут отвечать
По этой причине я пришел к такому выводу, чтобы проверить канал, и если он был жив, тогда позвольте вызвать методы возврата.
В сервисной части трюк будет похож на ↓
bool IsChannelAlive()
{
Logging logging = new Logging(LogFile);
try
{
if (((ICommunicationObject)_callbackChannel).State == CommunicationState.Opened)
{
logging.Log(LoggingMode.Prompt, "Channeld is still alive, can raise events...");
return true;
}
}
catch (Exception exp)
{
logging.Log(LoggingMode.Error, "IsChannelAlive()=> failed, EXP: {0}", exp);
}
logging.Log(LoggingMode.Warning, "Channeld is not alive so events won't raised...");
return false;
}
и в одном из моих событий я использую это как:
void stran_OperationTimedOut(object sender, EventArgs e)
{
if (IsChannelAlive())
_callbackChannel.OnOperationTimedOut();
}
Но какое-то время я использую этот трюк, чтобы узнать, что закрытый канал что-то делает:
public ImportService()
{
//Handle ContextClose to Audit all actions made in session
OperationContext.Current.InstanceContext.Closed += delegate
{
//Here
};
}
что не надежно.
Я все еще использую это IsAliveChannel()
в своих услугах.
Надеюсь, что этот ответ разрешит вашу проблему или даст вам подсказку.