你不能。一旦一个通道发生故障,它就会永远发生故障。您必须创建一个新频道。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
您无需在调用服务之前对其进行初始化。
几乎是我能提供的最好的。也许其他人有更好的方法。