или другие классы для реализации корректирующего поведения WCF для тайм-аутов и т. д.?

аюсь продлитьэтот ответ на ТАК сделать так, чтобы клиент WCF повторил временные сбои сети и обработалдругие ситуации, требующие повторной попытки, такие как истечение срока аутентификации.

Вопрос:

Какие исключения WCF необходимо обработать, и как правильно их обрабатывать?

Вот несколько примеров техник, которые я надеюсь увидеть вместо или в дополнение кproxy.abort():

Задержка X секунд до повтораЗакройте и заново создайте клиент New () WCF. Утилизируйте старый.Не повторяйте и не сбрасывайте эту ошибкуПовторите N раз, затем бросьте

Поскольку вряд ли один человек знает все исключения или способы их устранения, поделитесь тем, что вы знаете. Я соберу ответы и подходы в примере кода ниже.

    // USAGE SAMPLE
    //int newOrderId = 0; // need a value for definite assignment
    //Service<IOrderService>.Use(orderService=>
    //{
    //  newOrderId = orderService.PlaceOrder(request);
    //}




    /// <summary>
    /// A safe WCF Proxy suitable when sessionmode=false
    /// </summary>
    /// <param name="codeBlock"></param>
    public static void Use(UseServiceDelegateVoid<T> codeBlock)
    {
        IClientChannel proxy = (IClientChannel)_channelFactory.CreateChannel();
        bool success = false;
        try
        {
            codeBlock((T)proxy);
            proxy.Close();
            success = true;
        }
        catch (CommunicationObjectAbortedException e)
        {
                // Object should be discarded if this is reached.  
                // Debugging discovered the following exception here:
                // "Connection can not be established because it has been aborted" 
            throw e;
        }
        catch (CommunicationObjectFaultedException e)
        {
            throw e;
        }
        catch (MessageSecurityException e)
        {
            throw e;
        }
        catch (ChannelTerminatedException)
        {
            proxy.Abort(); // Possibly retry?
        }
        catch (ServerTooBusyException)
        {
            proxy.Abort(); // Possibly retry?
        }
        catch (EndpointNotFoundException)
        {
            proxy.Abort(); // Possibly retry?
        }
        catch (FaultException)
        {
            proxy.Abort();
        }
        catch (CommunicationException)
        {
            proxy.Abort();
        }
        catch (TimeoutException)
        {
         // Sample error found during debug: 

         // The message could not be transferred within the allotted timeout of 
         //  00:01:00. There was no space available in the reliable channel's 
         //  transfer window. The time allotted to this operation may have been a 
         //  portion of a longer timeout.

            proxy.Abort();
        }
        catch (ObjectDisposedException )
        {
            //todo:  handle this duplex callback exception.  Occurs when client disappears.  
            // Source: https://stackoverflow.com/questions/1427926/detecting-client-death-in-wcf-duplex-contracts/1428238#1428238
        }
        finally
        {
            if (!success)
            {
                proxy.Abort();
            }
        }
    }

Ответы на вопрос(4)

Ваш ответ на вопрос