Правильная обработка исключений при вызове метода обратного вызова WCF - PullRequest
0 голосов
/ 28 марта 2012

У меня есть серия служб WCF, которые снова вызывают методы на клиенте (используя WcfDuplexChannels) на основе событий на стороне сервера.Тем не менее, кажется, что могут возникнуть некоторые исключения, поэтому сейчас у меня есть огромный блок try / catch вокруг каждой строки, обращающейся к клиенту, заканчивающейся отключением события в случае возникновения какого-либо исключения.Помимо того, что каждый раз писать неудобно, Я не уверен, смогу ли я упростить блок try catch, перехватывая всего несколько базовых исключений? Сейчас мне все равно, что вызывает исключения (я не понимаюМне все равно, с ошибкой, с ошибкой, с удалением или с тайм-аутом), но я регистрирую разные исключения.

Я также читал о IErrorHandler, но будет ли это на самом деле подходящим при вызове метода на клиенте?

Вот пример моей текущей стратегии:

    private void OnProductChanged(List<DTO> products)
    {
        try
        {
            client.OnProductChanged(products);
            return;
        }
        catch (TimeoutException)
        {
            log.Info("Communication to client timed out.");
        }
        catch (CommunicationObjectAbortedException)
        {
            log.Info("Connection to client is in aborted state.");
        }
        catch (CommunicationObjectFaultedException)
        {
            log.Info("Connection to client is in faulted state.");
        }
        catch (CommunicationException ce)
        {
            log.InfoFormat("CommunicationException occured on product change notification: {0}.", ce.Message);
        }
        catch (ObjectDisposedException)
        {
            log.Info("Communication channel is disposed.");
        }
        catch (Exception e)
        {
            log.WarnFormat("Unhandled {0} on client callback: {1}", e.GetType(), e.Message);
        }

        SendProductChanged = false;
    }

Строка SendProductChanged = false; позаботится об отмене привязки обработчика события.

1 Ответ

1 голос
/ 28 марта 2012

Вы можете написать метод-обертку, который принимает Actions Funcs в качестве параметров, и вы можете использовать блоки try catch внутри этой функции.Вы можете вызывать свои функции, используя эту функцию;что-то вроде:

public void CallMethod(Action methodToBeCalled)
{
   try
   {
      methodToBeCalled();
   }
   catch 
   .....
   ....
}

Затем вызовите свои функции как:

CallMethod(() => client.OnProductChanged(products));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...