Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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ć.