Kanal Fabrikası ve Önbelleğe Alma
WCF istemci uygulamaları, ChannelFactory<TChannel> wcf hizmetiyle iletişim kanalı oluşturmak için sınıfını kullanır. Örnekleri oluşturmak ChannelFactory<TChannel> , aşağıdaki işlemleri içerdiğinden bazı ek yüklere neden olur:
Ağacı oluşturma ContractDescription
Tüm gerekli CLR türlerini Düşünceler
Kanal yığınını oluşturma
Kaynakları yok etme
Bu ek yükü en aza indirmeye yardımcı olmak için WCF, bir WCF istemci proxy'si kullanırken kanal fabrikalarını önbelleğe alabilir.
İpucu
Sınıfı doğrudan kullandığınızda ChannelFactory<TChannel> kanal fabrikası oluşturma üzerinde doğrudan denetiminiz vardır.
ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) ile oluşturulan WCF istemci proxy'leri öğesinden ClientBase<TChannel>türetilir. ClientBase<TChannel> kanal fabrikası önbelleğe alma davranışını tanımlayan statik CacheSetting bir özellik tanımlar. Önbellek ayarları belirli bir tür için yapılır. Örneğin, aşağıda tanımlanan değerlerden birine ayarlanması ClientBase<ITest>.CacheSettings
yalnızca türündeki ITest
ara sunucuyu/ClientBase'i etkiler. Belirli ClientBase<TChannel> bir sunucu için önbellek ayarı, ilk proxy/ClientBase örneği oluşturulur oluşturulmaz sabittir.
Önbelleğe Alma Davranışını Belirtme
Önbelleğe Alma davranışı, özelliği aşağıdaki değerlerden birine ayarlanarak CacheSetting belirtilir.
Önbellek Ayarı Değeri | Açıklama |
---|---|
AlwaysOn | Uygulama etki alanı içindeki tüm örnekleri ClientBase<TChannel> önbelleğe alma işlemine katılabilir. Geliştirici, önbelleğe alma işleminin herhangi bir olumsuz güvenlik etkisi olmadığını belirledi. Önbelleğe Alma üzerindeki "güvenlik duyarlı" özelliklere ClientBase<TChannel> erişilse bile kapatılmaz. "Güvenlik açısından hassas" özellikleri ClientBase<TChannel> ve EndpointChannelFactoryşeklindedirClientCredentials. |
Default | Yalnızca yapılandırma dosyalarında tanımlanan uç noktalardan oluşturulan örnekleri ClientBase<TChannel> , uygulama etki alanı içinde önbelleğe alma işlemine katılır. ClientBase<TChannel> Bu uygulama etki alanı içinde program aracılığıyla oluşturulan örnekleri önbelleğe alma işlemine katılmaz. Ayrıca, "güvenlik açısından hassas" özelliklerden herhangi birine erişildiğinde, örneğinde önbelleğe alma devre dışı bırakılır ClientBase<TChannel> . |
AlwaysOff | Önbelleğe Alma, söz konusu uygulama etki alanı içindeki belirli bir türün tüm örnekleri ClientBase<TChannel> için kapatılır. |
Aşağıdaki kod parçacıkları özelliğinin CacheSetting nasıl kullanılacağını göstermektedir.
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 { }
Yukarıdaki kodda, tüm örnekleri TestClient
aynı kanal fabrikasını kullanır.
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 {}
Yukarıdaki örnekte, örneği #4 dışında tüm örnekleri TestClient
aynı kanal fabrikasını kullanır. Örnek #4, kullanımı için özel olarak oluşturulmuş bir kanal fabrikası kullanır. Bu ayar, belirli bir uç noktanın aynı kanal fabrika türündeki diğer uç noktalardan (bu örnekte ITest
) farklı güvenlik ayarlarına ihtiyaç duyduğu senaryolar için çalışır.
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 {}
Yukarıdaki örnekte, tüm örnekleri farklı kanal fabrikaları TestClient
kullanır. Bu, her uç noktanın farklı güvenlik gereksinimleri olduğunda ve önbelleğe almak mantıklı olmadığında kullanışlıdır.