Udostępnij za pośrednictwem


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ć.

Zobacz też