共用方式為


通道處理站和快取

WCF 用戶端應用程式會使用 ChannelFactory<TChannel> 類別來建立與 WCF 服務的通訊通道。 建立 ChannelFactory<TChannel> 執行個體會產生額外負荷,因為這涉及到下列作業:

  • 建構 ContractDescription 樹狀

  • 反映所有必要的 CLR 型別

  • 建構通道堆疊

  • 處置資源

為了盡量減少這種負荷,WCF 可以在您使用 WCF 用戶端 Proxy 時快取通道處理站。

提示

直接使用 ChannelFactory<TChannel> 類別時,您可以直接控制通道處理站的建立作業。

使用 ServiceModel 中繼資料公用程式工具 (Svcutil.exe) 產生的 WCF 用戶端 Proxy 衍生自 ClientBase<TChannel>ClientBase<TChannel> 會定義用於定義通道處理站快取行為的靜態 CacheSetting 屬性。 快取設定會針對特定類型來設定。 例如,將 ClientBase<ITest>.CacheSettings 設定為下面定義的其中一個值,只會影響類型為 ITest 的 Proxy/ClientBase。 第一個 Proxy/ClientBase 執行個體一經建立,特定 ClientBase<TChannel> 的快取設定就會是不可變的。

指定快取行為

快取行為是藉由將 CacheSetting 屬性設定為下列其中一個值所指定。

快取設定值 描述
AlwaysOn 應用程式定義域內 ClientBase<TChannel> 的所有執行個體都可以參與快取。 開發人員已經確定對快取沒有不利的安全性影響。 即使存取 ClientBase<TChannel> 上的「安全性敏感」屬性,也不會關閉快取。 ClientBase<TChannel> 的「安全性敏感」屬性為 ClientCredentialsEndpointChannelFactory
Default 只有從定義於組態檔之端點建立的 ClientBase<TChannel> 執行個體才會在應用程式定義域中參與快取。 任何以程式設計方式在應用程式定義域內建立的 ClientBase<TChannel> 執行個體都不會參與快取。 此外,只要存取其中任何「安全性敏感」屬性,就會停用 ClientBase<TChannel> 執行個體的快取。
AlwaysOff 在相關應用程式定義域內,特定類型之所有 ClientBase<TChannel> 執行個體的快取都會關閉。

下列程式碼片段說明如何使用 CacheSetting 屬性。

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.AlwaysOn;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient (new BasicHttpBinding(), new EndpointAddress(address)))
         {
            // ...
            proxy.Test(msg);
            // ...
         }
      }
   }
}
// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest { }

在上述程式碼中,TestClient 的所有執行個體都將使用相同的通道處理站。

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.Default;
      int i = 1;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient ("MyEndpoint", new EndpointAddress(address)))
         {
            if (i == 4)
            {
               ServiceEndpoint endpoint = proxy.Endpoint;
               ... // use endpoint in some way
            }
            proxy.Test(msg);
         }
         i++;
   }
}

// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest {}

在上述範例中,除了執行個體 #4 以外,TestClient 的所有執行個體都會使用相同的通道處理站。 執行個體 #4 會使用專門針對其用途建立的通道處理站。 這個設定適用於特定端點需要的安全性設定與通道處理站類型 (在本例中為 ITest) 相同之其他端點所需安全性設定有所不同時的情節。

class Program
{
   static void Main(string[] args)
   {
      ClientBase<ITest>.CacheSettings = CacheSettings.AlwaysOff;
      foreach (string msg in messages)
      {
         using (TestClient proxy = new TestClient ("MyEndpoint", new EndpointAddress(address)))
         {
            proxy.Test(msg);
         }
      }
   }
}

// Generated by SvcUtil.exe
public partial class TestClient : System.ServiceModel.ClientBase, ITest {}

在上述範例中,TestClient 的所有執行個體都會使用不同的通道處理站。 當每個端點各有不同的安全性需求,而進行快取沒有意義時,這種方式非常有用。

另請參閱