Восстановление с CommunicationObjectFaultedException в WCF

Это - немного вещи, которую мне нравится называть Интернетом

14
задан Klay 6 August 2009 в 20:43
поделиться

1 ответ

Прокси-серверы клиентской службы не могут быть повторно использованы после сбоя. Вы должны избавиться от старого и воссоздать новый.

Вы также должны убедиться, что правильно закрыли прокси-сервер клиентской службы. Прокси-сервер службы WCF может генерировать исключение при закрытии, и если это произойдет, соединение не будет закрыто, поэтому вы должны прервать его. Используйте шаблон "попробуйте {Close} / catch {Abort}". Также имейте в виду, что метод dispose вызывает close (и, следовательно, может генерировать исключение из dispose), поэтому вы не можете просто использовать using like с обычными одноразовыми классами.

Например:

try
{
    if (yourServiceProxy != null)
    {
        if (yourServiceProxy.State != CommunicationState.Faulted)
        {
            yourServiceProxy.Close();
        }
        else
        {
            yourServiceProxy.Abort();
        }
    }
}
catch (CommunicationException)
{
    // Communication exceptions are normal when
    // closing the connection.
    yourServiceProxy.Abort();
}
catch (TimeoutException)
{
    // Timeout exceptions are normal when closing
    // the connection.
    yourServiceProxy.Abort();
}
catch (Exception)
{
    // Any other exception and you should 
    // abort the connection and rethrow to 
    // allow the exception to bubble upwards.
    yourServiceProxy.Abort();
    throw;
}
finally
{
    // This is just to stop you from trying to 
    // close it again (with the null check at the start).
    // This may not be necessary depending on
    // your architecture.
    yourServiceProxy = null;
}

Существует блог статья об этом здесь

34
ответ дан 1 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: