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