Одна из проблем, связанных с использованием одного экземпляра клиента (прокси-сервера WCF), заключается в том, что при возникновении сбоя прокси-сервер переходит в состояние Failed и не может быть повторно использован или Dispose-d, только Abort-ed. и создал заново. С другой стороны, если вы используете / требуете сеансов на стороне службы, вам нужен один и тот же экземпляр прокси для нескольких вызовов.
В любом случае, если вы хотите использовать прокси сейчас и потом беспокоиться о транспорте, сеансах или сбоях, я предлагаю такую обертку, которую я использую для моих прокси WCF:
TResult ExecuteServiceMethod<TResult>(Func<MyService, TResult> method)
{
var proxy = new MyService(); //...Or reuse an existing if not faulted
try
{
return method(proxy);
}
catch(Exception e)
{
//...Handle exceptions
}
finally
{
//...Per-call cleanup, for example proxy.Abort() if faulted...
}
}
и вы называете свои методы обслуживания следующим образом:
var result = ExecuteServiceMethod((MyService s) => s.VerifyUser(username, password));
Замените MyService
вашим действительным типом клиента. Таким образом, вы можете позже изменить свою стратегию открытия / закрытия / повторного использования, добавить ведение журнала и т. Д. Для всех вызовов службы, добавив код до или после строки return method(client)
.