У нас есть служба 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
}
Но это пахнет. Очевидно, мы могли бы избежать этого, используя нового клиента и избавляясь от него при каждом вызове. Это кажется ненужным, но, если это правильный путь, я думаю, что мы выберем именно его. Итак, как лучше всего правильно определить, находится ли клиент в неисправном состоянии, а затем что-то с этим предпринять? Должны ли мы действительно просто получать нового клиента для каждого вызова?
Еще одна вещь, о которой следует помнить - создание экземпляра клиента и вся эта проверка и обработка происходит в классе-оболочке для клиента. Если мы сделаем это так, как намеревались, это будет прозрачно для самого приложения - выполнение вызовов и обработка исключений из них не требует специального кода.