Вы не можете. Как только канал неисправен, он неисправен навсегда. Вы должны создать новый канал. Каналы WCF имеют состояние (в некотором смысле), поэтому неисправный канал означает, что состояние может быть повреждено.
То, что вы можете сделать, это поместить используемую логику в служебный метод:
public static class Service<T> where T : class, ICommunicationObject, new()
{
public static void AutoRepair(ref T co)
{
AutoRepair(ref co, () => new T());
}
public static void AutoRepair(ref T co, Func<T> createMethod)
{
if ((co != null) && (co.State == CommunicationState.Faulted))
{
co.Abort();
co = null;
}
if (co == null)
{
co = createMethod();
}
}
}
Затем вы можете вызвать свою службу со следующими данными:
Service<SampleServiceClient>.AutoRepair(ref service,
() => new SampleServiceClient(someParameter));
service.SomeMethod();
Или, если вы хотите использовать конструктор по умолчанию без параметров, просто:
Service<SampleServiceClient>.AutoRepair(ref service);
service.SomeMethod();
Поскольку он также обрабатывает случай, когда служба null
, вам не нужно инициализировать службу перед вызовом.
Практически лучшее, что я могу предложить. Может быть, у кого-то есть лучший способ.