Fabryka kanałów i buforowanie
Aplikacje klienckie WCF używają ChannelFactory<TChannel> klasy do tworzenia kanału komunikacyjnego z usługą WCF. Tworzenie ChannelFactory<TChannel> wystąpień wiąże się z pewnym obciążeniem, ponieważ obejmuje następujące operacje:
Konstruowanie ContractDescription drzewa
Emocje wszystkich wymaganych typów CLR
Konstruowanie stosu kanału
Usuwanie zasobów
Aby zminimalizować to obciążenie, program WCF może buforować fabryki kanałów w przypadku korzystania z serwera proxy klienta WCF.
Napiwek
Masz bezpośrednią kontrolę nad tworzeniem fabryki kanałów podczas bezpośredniego używania ChannelFactory<TChannel> klasy.
Serwery proxy klienta programu WCF wygenerowane za pomocą narzędzia ServiceModel Metadata Tool (Svcutil.exe) pochodzą z programu ClientBase<TChannel>. ClientBase<TChannel> definiuje właściwość statyczną CacheSetting definiującą zachowanie buforowania fabryki kanałów. Ustawienia pamięci podręcznej są tworzone dla określonego typu. Na przykład ustawienie ClientBase<ITest>.CacheSettings
jednej z wartości zdefiniowanych poniżej będzie miało wpływ tylko na ten serwer proxy/clientBase typu ITest
. Ustawienie pamięci podręcznej dla określonego ClientBase<TChannel> elementu jest niezmienne zaraz po utworzeniu pierwszego wystąpienia serwera proxy/bazy danych ClientBase.
Określanie zachowania Buforowanie
Buforowanie zachowanie jest określane przez ustawienie CacheSetting właściwości na jedną z następujących wartości.
Wartość ustawienia pamięci podręcznej | opis |
---|---|
AlwaysOn | Wszystkie wystąpienia ClientBase<TChannel> w domenie aplikacji mogą uczestniczyć w buforowaniu. Deweloper ustalił, że nie ma negatywnych konsekwencji w zakresie zabezpieczeń buforowania. Buforowanie nie zostaną wyłączone, nawet jeśli są dostępne właściwości ClientBase<TChannel> "wrażliwe na zabezpieczenia". Właściwości ClientBase<TChannel> "wrażliwe na zabezpieczenia" to ClientCredentials, Endpoint i ChannelFactory. |
Default | Tylko wystąpienia utworzone na ClientBase<TChannel> podstawie punktów końcowych zdefiniowanych w plikach konfiguracji uczestniczą w buforowaniu w domenie aplikacji. Wszystkie wystąpienia ClientBase<TChannel> utworzone programowo w tej domenie aplikacji nie będą uczestniczyć w buforowaniu. Ponadto buforowanie zostanie wyłączone dla wystąpienia ClientBase<TChannel> po uzyskaniu dostępu do dowolnego z jej właściwości "poufnych zabezpieczeń". |
AlwaysOff | Buforowanie jest wyłączona dla wszystkich wystąpień ClientBase<TChannel> określonego typu w danej domenie aplikacji. |
Poniższe fragmenty kodu ilustrują sposób używania CacheSetting właściwości .
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 { }
W powyższym kodzie wszystkie wystąpienia TestClient
programu będą używać tej samej fabryki kanałów.
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 {}
W powyższym przykładzie wszystkie wystąpienia klasy będą używać tej samej fabryki kanałów TestClient
, z wyjątkiem wystąpienia #4. Wystąpienie nr 4 będzie używać fabryki kanałów utworzonej specjalnie do użytku. To ustawienie działałoby w scenariuszach, w których określony punkt końcowy wymaga różnych ustawień zabezpieczeń od innych punktów końcowych tego samego typu fabryki kanału (w tym przypadku 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 {}
W powyższym przykładzie wszystkie wystąpienia programu TestClient
będą używać różnych fabryk kanałów. Jest to przydatne, gdy każdy punkt końcowy ma inne wymagania dotyczące zabezpieczeń i nie ma sensu buforować.