WCF, как я могу избежать ошибочных каналов, если они закрыты сервером из-за неактивности - PullRequest
0 голосов
/ 08 ноября 2011

Мой сервисный хост настроен на закрытие соединения через 10 минут

<wsHttpBinding>
    <binding receiveTimeout="00:10:00">
</wsHttpBinding>

В коде моего клиента перед использованием сервиса он проверен.Если он находится в закрытом / неисправном состоянии, он создаст новый.

    public static T ValidateService<T>(ref T service) where T : class
    {
        if (service is IClientChannel)
        {
            IClientChannel channel = service as IClientChannel;
            CommunicationState state = channel.State;
            if (state == CommunicationState.Faulted || state == CommunicationState.Closed)
            {
                // thread safe logic to create new service 
            }
        }
    }

Проблема в том, что канал закрыт на стороне сервера и channel.State по-прежнему будет возвращать состояние Open.После выполнения удаленного вызова я получаю исключение, вызванное ошибкой, и из-за receiveTimeout.

Есть ли какой-либо способ установить тайм-аут неактивности на стороне клиента?что-то вроде receiveTimeout="00:10:00" на сервере, но с несколькими секундами меньше, поэтому я могу приятно закрыть канал от клиента, если он не используется, и тогда моя логика ValidateService<T> создаст новый, если это необходимо.

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

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

Спасибо

1 Ответ

3 голосов
/ 08 ноября 2011

Вы не можете избежать обработки Faulted и Closed, поскольку всегда возможно, что какая-то проблема сети или подобное приведет к ситуации, когда вам придется создать новый Channel ...

РЕДАКТИРОВАТЬ - согласно комментарию:

В производственной среде у меня обычно есть клиентская реализация, которая обрабатывает определенные исключения, воссоздая Channel и повторяя попытку ... это заботится о случае, который вы описываете, и некоторых других случаях, таких как перехват сети и т. Д.

...