通道處理站和快取
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> 的「安全性敏感」屬性為 ClientCredentials、Endpoint 和 ChannelFactory。 |
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
的所有執行個體都會使用不同的通道處理站。 當每個端點各有不同的安全性需求,而進行快取沒有意義時,這種方式非常有用。