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

  • Odzwierciedlanie wszystkich wymaganych typów Wspólnego Typu Języka Uruchomieniowego (CLR)

  • Konstruowanie stosu kanałowego

  • Usuwanie zasobów

Aby zminimalizować to obciążenie, program WCF może buforować fabryki kanałów w przypadku korzystania z serwera proxy klienta WCF.

Wskazówka

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 ClientBase<TChannel>. ClientBase<TChannel> definiuje statyczną właściwość CacheSetting, określają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> jest niezmienne zaraz po utworzeniu pierwszego wystąpienia serwera proxy/ClientBase.

Określanie zachowania buforowania

Zachowanie buforowania 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 keszowaniu. Deweloper ustalił, że przechowywanie w pamięci podręcznej nie ma negatywnych konsekwencji dla bezpieczeństwa. Buforowanie nie zostanie 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 ClientBase<TChannel> utworzone z punktów końcowych określonych 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> w momencie uzyskania dostępu do którejkolwiek z jego właściwości wrażliwych na bezpieczeństwo.
AlwaysOff Wyłączono buforowanie dla wszystkich wystąpień typu ClientBase<TChannel> 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 będą używały 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 TestClient będą używać tej samej fabryki kanałów, z wyjątkiem wystąpienia #4. Instancja nr 4 użyje fabryki kanałów, która została utworzona specjalnie do jej użycia. To ustawienie może działać w scenariuszach, w których określony punkt końcowy potrzebuje innych ustawień zabezpieczeń niż pozostałe punkty końcowe fabryki tego samego typu 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 instancje TestClient będą korzystać z 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 także