Обработка перехода постоянного клиента WCF в состояние сбоя

У нас есть служба WCF, которую мы используем из веб-приложения. Используемый нами клиент был создан с использованием опции Visual Studio «Добавить ссылку на службу». Поскольку это веб-приложение, и поскольку природа приложения может привести к относительно коротким сеансам, мы решили создать экземпляр клиента, когда пользователь входит в систему, и хранить его в течение всего сеанса, а затем обрабатывать его удаление, когда сеанс завершен.

Это подводит меня к моему вопросу - мы пытаемся решить, как лучше всего обработать клиентский канал, входящий в состояние сбоя. Обыскав некоторые, мы пришли к следующему:

if(client.State = CommuncationState.Faulted)
{
    client = new Client();
}

try
{
    client.SomeMethod();
}
catch //specific exceptions left out for brevity
{
    //logging or whatever we decide to do
    throw;
}

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

Итак это оставляет нам делать что-то еще. Другой вариант, который мы придумали, был:

try
{
    client.SomeMethod();
}
catch
{
    if(client.State == CommunicationState.Faulted)
    {
        //we know we're faulted, try it again
        client = new Client();
        try
        {
            client.SomeMethod();
        }
        catch
        {
            throw;
        }
    }
    //handle other exceptions
}

Но это пахнет. Очевидно, мы могли бы избежать этого, используя нового клиента и избавляясь от него при каждом вызове. Это кажется ненужным, но, если это правильный путь, я думаю, что мы выберем именно его. Итак, как лучше всего правильно определить, находится ли клиент в неисправном состоянии, а затем что-то с этим предпринять? Должны ли мы действительно просто получать нового клиента для каждого вызова?

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

19
задан Zann Anderson 28 March 2011 в 19:41
поделиться