У нас есть служба WCF, которую мы потребляем из веб-приложения. Клиент, который мы используем, был создан с использованием опции «Добавить ссылку на службу» Visual Studio. Поскольку это веб-приложение, и поскольку характер приложения, скорее всего, приведет к относительно коротким сеансам, мы решили создать экземпляр клиента, когда пользователь входит в систему и сохраняет его в течение всего сеанса, а затем обрабатывать его, когда сеанс проходит.Обращение с постоянным клиентом WCF, входящим в состояние с ошибкой
Это подводит меня к моему вопросу - мы пытаемся решить, как лучше обращаться с каналом клиента, входящим в состояние 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
}
Но это пахнет. Очевидно, мы могли бы избежать этого, используя нового клиента и избавляясь от него для каждого вызова. Это кажется ненужным, но если это правильный путь, я думаю, это то, что мы выберем. Итак, каков наилучший способ изящно описать, находится ли клиент в неисправном состоянии, а затем что-то делать? Должны ли мы действительно просто получать нового клиента для каждого звонка?
Еще одна вещь, о которой нужно помнить - создание клиента и вся эта проверка и обработка происходит в классе-оболочке для клиента. Если мы сделаем это так, как мы намеревались, это прозрачно для самого приложения - для вызовов и обработки исключений из них не требуется никакого специального кода.
Что заставляет клиента вводить неисправное состояние? Я всегда имел возможность, чтобы служба WCF возвращала ошибку нормально, и клиент может продолжать рассказывать о своем бизнесе. Сервер не отвечает или что-то еще? – Tridus
В этом случае мы используем членство в ASP.NET, и мы столкнулись с ним, превысив атрибут userIsOnlineTimeWindow. Очевидно, что в этом случае имеет смысл просто перенаправить пользователя на страницу входа в систему, но мы стараемся, чтобы мы были готовы к любой другой ситуации, в которой мы могли бы попасть в неисправное состояние. – Zannjaminderson