Kanalfactory und ZwischenspeichernChannel Factory and Caching

WCF-Clientanwendungen verwenden die ChannelFactory<TChannel>-Klasse, um einen Kommunikationskanal mit einem WCF-Dienst zu erstellen.WCF client applications use the ChannelFactory<TChannel> class to create a communication channel with a WCF service. Die Erstellung von ChannelFactory<TChannel>-Instanzen verursacht einigen Mehraufwand, da sie die folgenden Vorgänge umfasst:Creating ChannelFactory<TChannel> instances incurs some overhead because it involves the following operations:

  • Erstellen der ContractDescription-StrukturConstructing the ContractDescription tree

  • Reflektieren aller erforderlichen CLR-TypenReflecting all of the required CLR types

  • Erstellen des KanalstapelsConstructing the channel stack

  • Freigeben von RessourcenDisposing of resources

Um den Mehraufwand zu minimieren, kann WCF Kanalfactorys zwischenspeichern, wenn Sie einen WCF-Clientproxy verwenden.To help minimize this overhead, WCF can cache channel factories when you are using a WCF client proxy.

Tipp

Sie können die Erstellung von Kanalfactorys direkt steuern, wenn Sie die ChannelFactory<TChannel>-Klasse direkt verwenden.You have direct control over channel factory creation when you use the ChannelFactory<TChannel> class directly.

Generiert mit WCF-Clientproxys ServiceModel Metadata Utility Tool (Svcutil.exe) abgeleitet sind ClientBase<TChannel>.WCF client proxies generated with ServiceModel Metadata Utility Tool (Svcutil.exe) are derived from ClientBase<TChannel>. ClientBase<TChannel> definiert eine statische CacheSetting-Eigenschaft, die das Cachingverhalten der Kanalfactory definiert.ClientBase<TChannel> defines a static CacheSetting property that defines channel factory caching behavior. Cacheeinstellungen gelten für einen bestimmten Typ.Cache settings are made for a specific type. Z. B. ClientBase<ITest>.CacheSettings auf einen der unten definierten Werte wirken sich nur die Proxy/ClientBase vom Typ ITest.For example, setting ClientBase<ITest>.CacheSettings to one of the values defined below will affect only those proxy/ClientBase of type ITest. Die Cacheeinstellung für eine bestimmte ClientBase<TChannel> ist unveränderlich, sobald die erste Proxy/ClientBase-Instanz erstellt wurde.The cache setting for a particular ClientBase<TChannel> is immutable as soon as the first proxy/ClientBase instance is created.

Angeben des CachingverhaltensSpecifying Caching Behavior

Das Cachingverhalten wird angegeben, indem die CacheSetting-Eigenschaft auf einen der folgenden Werte festgelegt wird.Caching behavior is specified by setting the CacheSetting property to one of the following values.

Wert der CacheeinstellungCache Setting Value BeschreibungDescription
AlwaysOn Alle Instanzen von ClientBase<TChannel> in der Anwendungsdomäne können am Caching teilnehmen.All instances of ClientBase<TChannel> within the app-domain can participate in caching. Der Entwickler hat bestimmt, dass die Sicherheit des Cachings nicht gefährdet wird.The developer has determined that there are no adverse security implications to caching. Caching wird nicht deaktiviert, auch wenn "sicherheitsrelevante" Eigenschaften für ClientBase<TChannel> zugegriffen werden.Caching will not be turned off even if "security-sensitive" properties on ClientBase<TChannel> are accessed. Die Eigenschaften "sicherheitsrelevante" ClientBase<TChannel> sind ClientCredentials, Endpoint und ChannelFactory.The "security-sensitive" properties of ClientBase<TChannel> are ClientCredentials, Endpoint and ChannelFactory.
Default Nur Instanzen von ClientBase<TChannel>, die aus in den Konfigurationsdateien definierten Endpunkten erstellt wurden, nehmen am Caching innerhalb der Anwendungsdomäne teil.Only instances of ClientBase<TChannel> created from endpoints defined in configuration files participate in caching within the app-domain. Alle Instanzen von ClientBase<TChannel>, die innerhalb dieser Anwendungsdomäne programmgesteuert erstellt wurden, nehmen nicht am Caching teil.Any instances of ClientBase<TChannel> created programmatically within that app-domain will not participate in caching. Darüber hinaus caching deaktiviert für eine Instanz von ClientBase<TChannel> , nachdem die Eigenschaften "sicherheitsrelevante" zugegriffen wird.Also, caching will be disabled for an instance of ClientBase<TChannel> once any of its "security-sensitive" properties is accessed.
AlwaysOff Das Caching wird für alle ClientBase<TChannel>-Instanzen eines bestimmten Typs innerhalb der betreffenden Anwendungsdomäne deaktiviert.Caching is turned off for all instances of ClientBase<TChannel> of a particular type within the app-domain in question.

In den folgenden Codeausschnitten wird die Verwendung der CacheSetting-Eigenschaft veranschaulicht.The following code snippets illustrate how to use the CacheSetting property.

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.In the above code, all instances of TestClient will use the same channel factory.

class Program   
{   
   static void Main(string[] args)   
   {   
      ClientBase.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.In the example above, all instances of TestClient would use the same channel factory except instance #4. Instanz #4 verwendet eine Kanalfactory, die speziell für diesen Zweck erstellt wird.Instance #4 would use a channel factory that is created specifically for its use. Diese Einstellung eignet sich für Szenarien, in denen ein bestimmter Endpunkt unterschiedliche Sicherheitseinstellungen anderer Endpunkte desselben Kanalfactorytyps (in diesem Fall ITest) benötigt.This setting would work for scenarios where a particular endpoint needs different security settings from the other endpoints of the same channel factory type (in this case ITest).

class Program   
{   
   static void Main(string[] args)   
   {   
      ClientBase.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.In the example above, all instances of TestClient would use different channel factories. Dies ist nützlich, wenn jeder Endpunkt verschiedene Sicherheitsanforderungen hat und das Caching keinen Sinn macht.This is useful when each endpoint has different security requirements and it makes no sense to cache.

Siehe auchSee Also

ClientBase<TChannel>
Erstellen von ClientsBuilding Clients
ClientsClients
Zugreifen auf Dienste mithilfe eines WCF-ClientsAccessing Services Using a WCF Client
Vorgehensweise: Verwenden von ChannelFactoryHow to: Use the ChannelFactory