Dot-Net
如何修復有故障的 WCF 通道?
當單個
ClientBase<T>實例用於多個 WCF 服務呼叫時,它會使通道進入故障狀態(即服務關閉時)。我想在服務再次啟動時自動修復頻道。我發現的唯一方法是在每個方法呼叫之前呼叫以下程式碼:
if (clientBase.InnerChannel.State == CommunicationState.Faulted) { clientBase.Abort(); ((IDisposable)clientBase).Dispose(); clientBase = new SampleServiceClientBase(); }我覺得這不是正確的做法。有人有更好的主意嗎?
你不能。一旦一個通道發生故障,它就會永遠發生故障。您必須創建一個新頻道。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您無需在呼叫服務之前對其進行初始化。幾乎是我能提供的最好的。也許其他人有更好的方法。