У нас есть служба WCF, которую мы используем в веб-приложении.Используемый нами клиент был сгенерирован с помощью опции «Добавить ссылку на службу» в Visual Studio.Поскольку это веб-приложение, и поскольку природа приложения может привести к относительно коротким сеансам, мы решили создать экземпляр клиента, когда пользователь входит в систему, и сохранять его в течение всей жизни сеанса, а затемобработайте его, когда закончится сеанс.
Это подводит меня к моему вопросу - мы пытаемся решить, как лучше всего обработать канал клиента, входящий в состояние Faults.Обыскав некоторые из них, мы пришли к следующему:
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;
}
Это, однако, не работает из-за того, что, по крайней мере, в нашем случае, даже если служба не работает, клиент будетпоказывать состояние Open
до тех пор, пока вы на самом деле не попытаетесь совершить вызов, используя его, после чего он перейдет в состояние Faulted
.
Так что нам остается заняться чем-то другим.Мы предложили еще один вариант:
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
}
Но это пахнет.Очевидно, мы могли бы избежать этого, используя новый клиент и распределяя его для каждого звонка.Это кажется ненужным, но если это правильный путь, то я думаю, что это то, что мы выберем.Итак, каков наилучший способ изящной обработки определить, находится ли клиент в неисправном состоянии, а затем что-то с этим делать?Должны ли мы просто получать нового клиента для каждого вызова?
Следует помнить еще одну вещь - создание экземпляра клиента и вся эта проверка и обработка происходят в классе-оболочке для клиента.Если мы сделаем это так, как намеревались, это прозрачно для самого приложения - для выполнения вызовов и обработки исключений из них не требуется никакого специального кода.