Kanalfactory und Zwischenspeichern

WCF-Clientanwendungen verwenden die ChannelFactory<TChannel>-Klasse, um einen Kommunikationskanal mit einem WCF-Dienst zu erstellen. Die Erstellung von ChannelFactory<TChannel>-Instanzen verursacht einigen Mehraufwand, da sie die folgenden Vorgänge umfasst:

  • Erstellen der ContractDescription-Struktur

  • Reflektieren aller erforderlichen CLR-Typen

  • Erstellen des Kanalstapels

  • Freigeben von Ressourcen

Um den Mehraufwand zu minimieren, kann WCF Kanalfactorys zwischenspeichern, wenn Sie einen WCF-Clientproxy verwenden.

Tipp

Sie können die Erstellung von Kanalfactorys direkt steuern, wenn Sie die ChannelFactory<TChannel>-Klasse direkt verwenden.

WCF-Clientproxys, die mit dem ServiceModel Metadata Utility Tool (Svcutil.exe) generiert wurden, werden von ClientBase<TChannel> abgeleitet. ClientBase<TChannel> definiert eine statische CacheSetting-Eigenschaft, die das Cachingverhalten der Kanalfactory definiert. Cacheeinstellungen gelten für einen bestimmten Typ. Wenn ClientBase<ITest>.CacheSettings beispielsweise auf einen der unten definierten Werte festgelegt wird, wirkt sich das nur auf die Proxy/ClientBase vom Typ ITest aus. Die Cacheeinstellung für eine bestimmte ClientBase<TChannel> ist unveränderlich, sobald die erste Proxy/ClientBase-Instanz erstellt wurde.

Angeben des Cachingverhaltens

Das Cachingverhalten wird angegeben, indem die CacheSetting-Eigenschaft auf einen der folgenden Werte festgelegt wird.

Wert der Cacheeinstellung Beschreibung
AlwaysOn Alle Instanzen von ClientBase<TChannel> in der Anwendungsdomäne können am Caching teilnehmen. Der Entwickler hat bestimmt, dass die Sicherheit des Cachings nicht gefährdet wird. Das Zwischenspeichern wird nicht deaktiviert, auch wenn auf „sicherheitsrelevante“ Eigenschaften von ClientBase<TChannel> zugegriffen wird. Die „sicherheitsrelevanten“ Eigenschaften von ClientBase<TChannel> sind ClientCredentials, Endpoint und ChannelFactory.
Default Nur Instanzen von ClientBase<TChannel>, die aus in den Konfigurationsdateien definierten Endpunkten erstellt wurden, nehmen am Caching innerhalb der Anwendungsdomäne teil. Alle Instanzen von ClientBase<TChannel>, die innerhalb dieser Anwendungsdomäne programmgesteuert erstellt wurden, nehmen nicht am Caching teil. Außerdem wird das Zwischenspeichern für eine Instanz von ClientBase<TChannel> deaktiviert, sobald auf eine der zugehörigen sicherheitsrelevanten Eigenschaften zugegriffen wird.
AlwaysOff Das Caching wird für alle ClientBase<TChannel>-Instanzen eines bestimmten Typs innerhalb der betreffenden Anwendungsdomäne deaktiviert.

In den folgenden Codeausschnitten wird die Verwendung der CacheSetting-Eigenschaft veranschaulicht.

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 { }

Im obigen Code verwenden alle Instanzen von TestClient die gleiche Kanalfactory.

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 {}

Im obigen Beispiel verwenden alle Instanzen von TestClient die gleiche Kanalfactory, mit Ausnahme von #4. Instanz #4 verwendet eine Kanalfactory, die speziell für diesen Zweck erstellt wird. Diese Einstellung eignet sich für Szenarien, in denen ein bestimmter Endpunkt unterschiedliche Sicherheitseinstellungen anderer Endpunkte desselben Kanalfactorytyps (in diesem Fall ITest) benötigt.

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 {}

Im obigen Beispiel verwenden alle Instanzen von TestClient verschiedene Kanalfactorys. Dies ist nützlich, wenn jeder Endpunkt verschiedene Sicherheitsanforderungen hat und das Caching keinen Sinn macht.

Siehe auch