Dot-Net

如何修復有故障的 WCF 通道?

  • May 13, 2016

當單個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您無需在呼叫服務之前對其進行初始化。

幾乎是我能提供的最好的。也許其他人有更好的方法。

引用自:https://stackoverflow.com/questions/2008382