Kanalfabrik och Cachelagring
WCF-klientprogram använder ChannelFactory<TChannel> klassen för att skapa en kommunikationskanal med en WCF-tjänst. Att skapa ChannelFactory<TChannel> instanser medför vissa omkostnader eftersom det omfattar följande åtgärder:
ContractDescription Konstruera trädet
Återspeglar alla nödvändiga CLR-typer
Konstruera kanalstacken
Disponera resurser
För att minimera detta kan WCF cachelagras kanalfabriker när du använder en WCF-klientproxy.
Dricks
Du har direkt kontroll över skapandet av kanalfabriken ChannelFactory<TChannel> när du använder klassen direkt.
WCF-klientproxy som genereras med ServiceModel Metadata Utility Tool (Svcutil.exe) härleds från ClientBase<TChannel>. ClientBase<TChannel> definierar en statisk CacheSetting egenskap som definierar kanalfabrikens cachelagringsbeteende. Cacheinställningar görs för en viss typ. Om du till exempel anger ClientBase<ITest>.CacheSettings
ett av de värden som definieras nedan påverkas endast proxyn/ClientBase av typen ITest
. Cacheinställningen för en viss ClientBase<TChannel> är oföränderlig så snart den första proxy-/ClientBase-instansen har skapats.
Ange Cachelagring beteende
Cachelagring beteende anges genom att ställa in CacheSetting egenskapen på något av följande värden.
Värde för cacheinställning | beskrivning |
---|---|
AlwaysOn | Alla instanser av ClientBase<TChannel> i appdomänen kan delta i cachelagring. Utvecklaren har fastställt att det inte finns några negativa säkerhetskonsekvenser för cachelagring. Cachelagring inaktiveras inte även om "säkerhetskänsliga" egenskaper ClientBase<TChannel> används. De "säkerhetskänsliga" egenskaperna ClientBase<TChannel> för är ClientCredentials, Endpoint och ChannelFactory. |
Default | Endast instanser av ClientBase<TChannel> skapade från slutpunkter som definierats i konfigurationsfiler deltar i cachelagring i appdomänen. Alla instanser av ClientBase<TChannel> skapade programmatiskt inom appdomänen kommer inte att delta i cachelagring. Cachelagring inaktiveras också för en instans av ClientBase<TChannel> när någon av dess "säkerhetskänsliga" egenskaper har använts. |
AlwaysOff | Cachelagring är inaktiverat för alla instanser av ClientBase<TChannel> en viss typ i den aktuella appdomänen. |
Följande kodfragment visar hur du använder egenskapen CacheSetting .
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 { }
I koden ovan använder alla instanser av TestClient
samma kanalfabrik.
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 {}
I exemplet ovan skulle alla instanser av TestClient
använda samma kanalfabrik utom instans nr 4. Instans nr 4 skulle använda en kanalfabrik som skapas specifikt för dess användning. Den här inställningen fungerar för scenarier där en viss slutpunkt behöver olika säkerhetsinställningar från de andra slutpunkterna av samma kanalfabrikstyp (i det här fallet 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 {}
I exemplet ovan skulle alla instanser av TestClient
använda olika kanalfabriker. Detta är användbart när varje slutpunkt har olika säkerhetskrav och det inte är meningsfullt att cachelagras.