Правильный способ обработки исключений, связанных с сетью WCF

В приложении, с которым я работаю, есть некоторая связь с удаленной службой с использованием WCF (базовая привязка http, никаких причудливых вещей). Поскольку клиент легковесен, детали сервера не имеют значения, вы можете предположить, что есть только метод, который всегда возвращает true (например, ping или что-то в этом роде).

Прокси генерируется с использованием параметра Task, новый экземпляр клиента создается каждый раз при вызове операции. Что-то вроде этого может крутиться внутри таймера:

      void Foo()
        {
            var client = new PingServiceClient();

            try
            {
                bool result = client.PingAsync().GetAwaiter().GetResult();
            }
            catch
            {
                //log something
            }
            finally
            {
                client.Abort();
            }
        }

Мой вопрос в том, как мне правильно обрабатывать случаи, когда сеть не работает? Потому что поведение другое. Я либо получаю сбой приложения (я предполагаю, что на финализаторе задачи, который по какой-то причине не обрабатывается ни в AppDomain.CurrentDomain.UnhandledException, ни в TaskScheduler.UnobservedTaskException), или иногда он просто молча выводит тонны сообщений об ошибках, но ничего не сбой . Такие сообщения:

      Exception thrown: 'System.Net.Sockets.SocketException' in System.dll
Exception thrown: 'System.Net.Sockets.SocketException' in System.dll
Exception thrown: 'System.Net.Sockets.SocketException' in System.dll
Exception thrown: 'System.Net.WebException' in System.dll
Exception thrown: 'System.ServiceModel.EndpointNotFoundException' in System.ServiceModel.dll
Exception thrown: 'System.ServiceModel.EndpointNotFoundException' in System.ServiceModel.Internals.dll
Exception thrown: 'System.ServiceModel.EndpointNotFoundException' in System.ServiceModel.Internals.dll
Exception thrown: 'System.ServiceModel.EndpointNotFoundException' in System.ServiceModel.Internals.dll
Exception thrown: 'System.ServiceModel.EndpointNotFoundException' in System.ServiceModel.Internals.dll
Exception thrown: 'System.Net.Sockets.SocketException' in System.dll
Exception thrown: 'System.AggregateException' in mscorlib.dll

Я изо всех сил пытаюсь найти изящный способ справиться с этим, поэтому, если у кого-то есть какие-то знания об этом, поделитесь подходом.

Заранее спасибо.

UPD: я попытался пересоздать прокси с парой Begin/End и переопределить реализацию конечного метода в частичном классе:

      public partial class PingServiceClient : IPingServiceClient, PingService
    {
        public Task<bool> PingSync()
        {
            return Task.Factory.FromAsync(BeginPing(null, null), HandledEndPing);
        }

        private bool HandledEndPing(System.IAsyncResult result)
        {
            var res = false;

            try
            {
                res = EndPing(result);
            }
            catch (Exception e)
            {
                ;
            }

            return res;
        }
    }

Все тот же шквал сообщений на выходе, что и раньше (однако ловушка работает).

0 ответов

Другие вопросы по тегам