Я делаю все свои вызовы WCF из пользовательского оператора «using», который обрабатывает исключения и потенциальные отключения. Мой код дополнительно позволяет мне передать объект политики в оператор, чтобы я мог легко изменить поведение, например, если я не хочу повторять попытку при ошибке.
Суть кода заключается в следующем:
[MethodImpl(MethodImplOptions.NoInlining)]
public static void ProxyUsing<T>(ClientBase<T> proxy, Action action)
where T : class
{
try
{
proxy.Open();
using(OperationContextScope context = new OperationContextScope(proxy.InnerChannel))
{
//Add some headers here, or whatever you want
action();
}
}
catch(FaultException fe)
{
//Handle stuff here
}
finally
{
try
{
if(proxy != null
&& proxy.State != CommunicationState.Faulted)
{
proxy.Close();
}
else
{
proxy.Abort();
}
}
catch
{
if(proxy != null)
{
proxy.Abort();
}
}
}
}
Затем вы можете использовать вызов следующим образом:
ProxyUsing<IMyService>(myService = GetServiceInstance(), () =>
{
myService.SomeMethod(...);
});
Вызов NoInlining, вероятно, не важен для вас. Мне это нужно, потому что у меня есть некоторый пользовательский код регистрации, который регистрирует стек вызовов после исключения, поэтому в этом случае важно сохранить иерархию методов.