Sdílet prostřednictvím


Postup kanálu a mezipaměť

Klientské aplikace WCF používají ChannelFactory<TChannel> třídu k vytvoření komunikačního kanálu se službou WCF. Vytváření ChannelFactory<TChannel> instancí způsobuje určité režijní náklady, protože zahrnuje následující operace:

  • ContractDescription Vytvoření stromu

  • Reflexe všech požadovaných typů CLR

  • Vytvoření zásobníku kanálů

  • Disposing of resources

Kvůli minimalizaci této režie může WCF ukládat objekty pro vytváření kanálů do mezipaměti při použití proxy klienta WCF.

Tip

Při přímém používání třídy máte přímou kontrolu nad vytvářením kanálu.ChannelFactory<TChannel>

Proxy servery klienta WCF generované nástrojem ServiceModel Metadata Utility Tool (Svcutil.exe) jsou odvozeny z ClientBase<TChannel>. ClientBase<TChannel> definuje statickou CacheSetting vlastnost, která definuje chování při ukládání do mezipaměti objektu pro vytváření kanálů. Nastavení mezipaměti se provádí pro určitý typ. Například nastavení ClientBase<ITest>.CacheSettings na jednu z níže definovaných hodnot ovlivní pouze ty proxy/ClientBase typu ITest. Nastavení mezipaměti pro určitou ClientBase<TChannel> hodnotu je neměnné, jakmile se vytvoří první instance proxy serveru nebo ClientBase.

Určení chování Ukládání do mezipaměti

Ukládání do mezipaměti chování je určeno nastavením CacheSetting vlastnosti na jednu z následujících hodnot.

Hodnota nastavení mezipaměti Popis
AlwaysOn Všechny instance ClientBase<TChannel> v rámci domény aplikace se mohou účastnit ukládání do mezipaměti. Vývojář zjistil, že ukládání do mezipaměti nemá nepříznivý dopad na zabezpečení. Ukládání do mezipaměti nebudou vypnuty ani v případě, že jsou přístupné vlastnosti citlivé na ClientBase<TChannel> zabezpečení. Vlastnosti "citlivé na zabezpečení" ClientBase<TChannel> jsou ClientCredentialsa EndpointChannelFactory.
Default Ukládání do mezipaměti v doméně aplikace se účastní pouze instance ClientBase<TChannel> vytvořené z koncových bodů definovaných v konfiguračních souborech. Všechny instance ClientBase<TChannel> vytvořené prostřednictvím kódu programu v rámci této domény aplikace se nebudou účastnit ukládání do mezipaměti. Ukládání do mezipaměti se také zakáže pro instanci ClientBase<TChannel> , kdy se k některé z vlastností citlivých na zabezpečení přistupuje.
AlwaysOff Ukládání do mezipaměti je vypnutá pro všechny instance ClientBase<TChannel> určitého typu v dané doméně aplikace.

Následující fragmenty kódu ilustrují použití CacheSetting vlastnosti.

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

Ve výše uvedeném kódu budou všechny instance TestClient používat stejnou továrnu kanálu.

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

V předchozím příkladu by všechny instance používaly stejnou továrnu TestClient kanálu s výjimkou instance č. 4. Instance č. 4 by používala objekt pro vytváření kanálů vytvořený speciálně pro jeho použití. Toto nastavení by fungovalo ve scénářích, kdy konkrétní koncový bod potřebuje různá nastavení zabezpečení od ostatních koncových bodů stejného typu objektu pro vytváření kanálů (v tomto případě 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 {}

V předchozím příkladu by všechny instance používaly různé objekty TestClient pro vytváření kanálů. To je užitečné, když má každý koncový bod jiné požadavky na zabezpečení a nemá smysl ukládat do mezipaměti.

Viz také