Konfigurowanie i rozszerzanie środowiska uruchomieniowego za pomocą zachowań
Zachowania umożliwiają modyfikowanie zachowania domyślnego i dodawanie niestandardowych rozszerzeń, które sprawdzają i weryfikują konfigurację usługi lub modyfikują zachowanie środowiska uruchomieniowego w aplikacjach klienckich i usług programu Windows Communication Foundation (WCF). W tym temacie opisano interfejsy zachowania, sposób ich implementowania oraz sposób ich dodawania do opisu usługi (w aplikacji usługi) lub punktu końcowego (w aplikacji klienckiej) programowo lub w pliku konfiguracji. Aby uzyskać więcej informacji na temat używania zachowań udostępnianych przez system, zobacz Określanie zachowania czasu wykonywania usługi i Określanie zachowania czasu wykonywania klienta.
Zachowania
Typy zachowań są dodawane do obiektów opisu punktu końcowego usługi lub usługi (odpowiednio w usłudze lub kliencie), zanim te obiekty będą używane przez program Windows Communication Foundation (WCF) do utworzenia środowiska uruchomieniowego, które wykonuje usługę WCF lub klienta WCF. Gdy te zachowania są wywoływane podczas procesu budowy środowiska uruchomieniowego, mogą uzyskiwać dostęp do właściwości i metod środowiska uruchomieniowego, które modyfikują środowisko uruchomieniowe skonstruowane przez kontrakt, powiązania i adresy.
Metody zachowania
Wszystkie zachowania mają metodę AddBindingParameters
, ApplyDispatchBehavior
metodę, Validate
metodę i ApplyClientBehavior
metodę z jednym wyjątkiem: Ponieważ IServiceBehavior nie można wykonać w kliencie, nie implementuje ApplyClientBehavior
metody .
AddBindingParameters
Użyj metody , aby zmodyfikować lub dodać obiekty niestandardowe do kolekcji, do których powiązania niestandardowe mogą uzyskiwać dostęp do ich użycia podczas konstruowania środowiska uruchomieniowego. Na przykład w ten sposób określono wymagania dotyczące ochrony, które mają wpływ na sposób tworzenia kanału, ale nie są znane przez dewelopera kanału.Validate
Użyj metody , aby zbadać drzewo opisu i odpowiadający mu obiekt środowiska uruchomieniowego, aby upewnić się, że jest on zgodny z pewnym zestawem kryteriów.ApplyDispatchBehavior
Użyj metod iApplyClientBehavior
, aby zbadać drzewo opisu i zmodyfikować środowisko uruchomieniowe dla określonego zakresu w usłudze lub kliencie. Można również wstawić obiekty rozszerzeń.Uwaga
Mimo że drzewo opisu jest podane w tych metodach, jest przeznaczone tylko do badania. Jeśli drzewo opisu zostanie zmodyfikowane, zachowanie jest niezdefiniowane.
Do właściwości, które można zmodyfikować, oraz interfejsów dostosowywania, do których można zaimplementować, są dostępne za pośrednictwem klas środowiska uruchomieniowego usługi i klienta. Typy usług to DispatchRuntime klasy i DispatchOperation . Typy klientów to ClientRuntime klasy i ClientOperation . Klasy ClientRuntime i DispatchRuntime to punkty wejścia rozszerzalności, aby uzyskać dostęp odpowiednio do właściwości środowiska uruchomieniowego całego klienta i całej usługi oraz kolekcji rozszerzeń. ClientOperation Podobnie klasy i DispatchOperation uwidaczniają odpowiednio właściwości środowiska uruchomieniowego operacji klienta i operacji usługi oraz kolekcje rozszerzeń. Można jednak uzyskać dostęp do szerszego obiektu środowiska uruchomieniowego o szerszym zakresie z obiektu środowiska uruchomieniowego operacji i na odwrót, jeśli jest to konieczne.
Uwaga
Aby zapoznać się z omówieniem właściwości środowiska uruchomieniowego i typów rozszerzeń, których można użyć do modyfikowania zachowania wykonywania klienta, zobacz Rozszerzanie klientów. Aby zapoznać się z omówieniem właściwości środowiska uruchomieniowego i typów rozszerzeń, których można użyć do modyfikowania zachowania wykonywania dyspozytora usługi, zobacz Rozszerzanie dyspozytorów.
Większość użytkowników programu WCF nie współdziała bezpośrednio ze środowiskiem uruchomieniowym; Zamiast tego używają podstawowych konstrukcji modelu programowania, takich jak punkty końcowe, kontrakty, powiązania, adresy i atrybuty zachowania w klasach lub zachowaniach w plikach konfiguracji. Te konstrukcje składają się na drzewo opisu, które jest pełną specyfikacją tworzenia środowiska uruchomieniowego do obsługi usługi lub klienta opisanego przez drzewo opisu.
W programie WCF istnieją cztery rodzaje zachowań:
Zachowania usługi (IServiceBehavior typy) umożliwiają dostosowanie całego środowiska uruchomieniowego usługi, w tym ServiceHostBase.
Zachowania punktów końcowych (IEndpointBehavior typy) umożliwiają dostosowywanie punktów końcowych usługi i skojarzonych z EndpointDispatcher nimi obiektów.
Zachowania kontraktów (IContractBehavior typy) umożliwiają dostosowywanie klas ClientRuntime i DispatchRuntime odpowiednio w aplikacjach klienckich i usług.
Zachowania operacji (IOperationBehavior typy) umożliwiają ClientOperation dostosowywanie klas i DispatchOperation , ponownie, na kliencie i usłudze.
Te zachowania można dodać do różnych obiektów opisu, implementując atrybuty niestandardowe, używając plików konfiguracji aplikacji lub bezpośrednio dodając je do kolekcji zachowań w odpowiednim obiekcie opisu. Należy jednak dodać element do obiektu opisu usługi lub opisu punktu końcowego usługi przed wywołaniem ICommunicationObject.Open elementu ServiceHost lub ChannelFactory<TChannel>.
Zakresy zachowania
Istnieją cztery typy zachowań, z których każdy odpowiada określonemu zakresowi dostępu do środowiska uruchomieniowego.
Zachowania usługi
Zachowania usługi, które implementują IServiceBehaviorprogram , są podstawowym mechanizmem, za pomocą którego modyfikujesz całe środowisko uruchomieniowe usługi. Istnieją trzy mechanizmy dodawania zachowań usługi do usługi.
Używanie atrybutu w klasie usługi. Po skonstruowaniu ServiceHost elementu implementacja ServiceHost używa odbicia w celu odnalezienia zestawu atrybutów typu usługi. Jeśli którykolwiek z tych atrybutów to implementacje IServiceBehaviorprogramu , są one dodawane do kolekcji zachowań w pliku ServiceDescription. Dzięki temu te zachowania mogą uczestniczyć w budowie czasu wykonywania usługi.
Programowe dodawanie zachowania do kolekcji zachowań w programie ServiceDescription. Można to zrobić za pomocą następujących wierszy kodu:
ServiceHost host = new ServiceHost(/* Parameters */); host.Description.Behaviors.Add(/* Service Behavior */);
Implementowanie niestandardowego BehaviorExtensionElement rozszerzenia konfiguracji. Umożliwia to korzystanie z zachowania usługi z plików konfiguracji aplikacji.
Przykłady zachowań usługi w programie WCF obejmują ServiceBehaviorAttribute atrybut , ServiceThrottlingBehaviori ServiceMetadataBehavior zachowanie.
Zachowania kontraktu
Zachowania kontraktu, które implementują IContractBehavior interfejs, są używane do rozszerzania zarówno środowiska uruchomieniowego klienta, jak i usługi w ramach kontraktu.
Istnieją dwa mechanizmy dodawania zachowań kontraktu do kontraktu. Pierwszy mechanizm polega na utworzeniu atrybutu niestandardowego, który ma być używany w interfejsie kontraktu. Gdy interfejs kontraktu jest przekazywany do elementu ServiceHost lub ChannelFactory<TChannel>, program WCF sprawdza atrybuty w interfejsie. Jeśli jakiekolwiek atrybuty są implementacjami IContractBehaviorprogramu , są one dodawane do kolekcji zachowań utworzonych dla tego interfejsu System.ServiceModel.Description.ContractDescription .
Można również zaimplementować System.ServiceModel.Description.IContractBehaviorAttribute atrybut zachowania kontraktu niestandardowego. W takim przypadku zachowanie jest następujące w przypadku zastosowania do:
•Interfejs kontraktu. W takim przypadku zachowanie jest stosowane do wszystkich kontraktów tego typu w dowolnym punkcie końcowym, a program WCF ignoruje wartość IContractBehaviorAttribute.TargetContract właściwości.
•Klasa usługi. W takim przypadku zachowanie jest stosowane tylko do punktów końcowych, których kontrakt jest wartością TargetContract właściwości.
•Klasa wywołania zwrotnego. W takim przypadku zachowanie jest stosowane do punktu końcowego klienta dwustronnego, a program WCF ignoruje wartość TargetContract właściwości.
Drugi mechanizm polega na dodaniu zachowania do kolekcji zachowań w obiekcie ContractDescription.
Przykłady zachowań kontraktów w programie WCF obejmują System.ServiceModel.DeliveryRequirementsAttribute atrybut . Aby uzyskać więcej informacji i przykład, zobacz temat referencyjny.
Zachowania punktów końcowych
Zachowania punktów końcowych, które implementują IEndpointBehavior, są podstawowym mechanizmem, za pomocą którego można zmodyfikować cały czas wykonywania usługi lub klienta dla określonego punktu końcowego.
Istnieją dwa mechanizmy dodawania zachowań punktów końcowych do usługi.
Dodaj zachowanie do Behaviors właściwości .
Zaimplementuj niestandardowy BehaviorExtensionElement , który rozszerza konfigurację.
Aby uzyskać więcej informacji i przykład, zobacz temat referencyjny.
Zachowania operacji
Zachowania operacji, które implementują IOperationBehavior interfejs, są używane do rozszerzania zarówno środowiska uruchomieniowego klienta, jak i usługi dla każdej operacji.
Istnieją dwa mechanizmy dodawania zachowań operacji do operacji. Pierwszy mechanizm polega na utworzeniu atrybutu niestandardowego, który ma być używany w metodzie modelowej operacji. Po dodaniu operacji do ServiceHost elementu lub ChannelFactoryprogramu WCF dodaje wszelkie IOperationBehavior atrybuty do kolekcji zachowań utworzonej OperationDescription dla tej operacji.
Drugi mechanizm polega na bezpośrednim dodaniu zachowania do kolekcji zachowań na skonstruowanym OperationDescriptionobiekcie .
Przykłady zachowań operacji w programie WCF obejmują element OperationBehaviorAttribute i TransactionFlowAttribute.
Aby uzyskać więcej informacji i przykład, zobacz temat referencyjny.
Używanie konfiguracji do tworzenia zachowań
Zachowania usługi i punktu końcowego oraz kontraktu mogą być określone w kodzie lub przy użyciu atrybutów; Tylko zachowania usługi i punktu końcowego można skonfigurować przy użyciu plików konfiguracji aplikacji lub sieci Web. Udostępnianie zachowań przy użyciu atrybutów umożliwia deweloperom określenie zachowania w czasie kompilacji, którego nie można dodać, usunąć ani zmodyfikować w czasie wykonywania. Jest to często odpowiednie w przypadku zachowań, które są zawsze wymagane do prawidłowej operacji usługi (na przykład parametrów związanych z transakcją z atrybutem System.ServiceModel.ServiceBehaviorAttribute ). Uwidacznianie zachowań przy użyciu konfiguracji umożliwia deweloperom pozostawienie specyfikacji i konfiguracji tych zachowań osobom wdrażającym usługę. Jest to odpowiednie w przypadku zachowań, które są opcjonalnymi składnikami lub inną konfiguracją specyficzną dla wdrożenia, takie jak uwidocznienie metadanych dla usługi lub określonej konfiguracji autoryzacji dla usługi.
Uwaga
Możesz również użyć zachowań, które obsługują konfigurację, aby wymusić zasady aplikacji firmowych, wstawiając je do pliku konfiguracji machine.config i blokując te elementy. Opis i przykład można znaleźć w temacie Instrukcje: blokowanie punktów końcowych w przedsiębiorstwie.
Aby uwidocznić zachowanie przy użyciu konfiguracji, deweloper musi utworzyć klasę pochodną, BehaviorExtensionElement a następnie zarejestrować to rozszerzenie w konfiguracji.
Poniższy przykład kodu pokazuje, jak implementuje BehaviorExtensionElementelement IEndpointBehavior :
// BehaviorExtensionElement members
public override Type BehaviorType
{
get { return typeof(EndpointBehaviorMessageInspector); }
}
protected override object CreateBehavior()
{
return new EndpointBehaviorMessageInspector();
}
Aby system konfiguracji mógł załadować niestandardowy BehaviorExtensionElementelement , musi zostać zarejestrowany jako rozszerzenie. Poniższy przykład kodu przedstawia plik konfiguracji poprzedniego zachowania punktu końcowego:
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="metadataSupport"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/ServiceMetadata" />
</baseAddresses>
</host>
<endpoint
address="/SampleService"
binding="wsHttpBinding"
behaviorConfiguration="withMessageInspector"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="withMessageInspector">
<endpointMessageInspector />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add
name="endpointMessageInspector"
type="Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
</configuration>
Gdzie Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector
jest typem rozszerzenia zachowania i HostApplication
jest nazwą zestawu, do którego została skompilowana ta klasa.
Kolejność oceny
System.ServiceModel.ServiceHost I System.ServiceModel.ChannelFactory<TChannel> są odpowiedzialne za tworzenie środowiska uruchomieniowego z modelu programowania i opisu. Zachowania, zgodnie z wcześniejszym opisem, przyczyniają się do tego procesu kompilacji w usłudze, punkcie końcowym, kontrakcie i operacji.
Stosowane ServiceHost zachowania w następującej kolejności:
Usługa
Kontrakt
Punkt końcowy
Operacja
W ramach dowolnej kolekcji zachowań nie ma gwarantowanej kolejności.
Stosowane ChannelFactory<TChannel> zachowania w następującej kolejności:
Kontrakt
Punkt końcowy
Operacja
W ramach każdej kolekcji zachowań ponownie nie ma gwarantowanej kolejności.
Programowe dodawanie zachowań
System.ServiceModel.Description.ServiceDescription Właściwości obiektu w aplikacji usługi nie mogą być modyfikowane po metodzie CommunicationObject.OnOpening w pliku System.ServiceModel.ServiceHostBase. Niektóre elementy członkowskie, takie jak ServiceHostBase.Credentials właściwość i AddServiceEndpoint
metody w systemach ServiceHostBase i System.ServiceModel.ServiceHost, zgłaszają wyjątek, jeśli zmodyfikowano poprzedni punkt. Inni zezwalają na ich modyfikowanie, ale wynik jest niezdefiniowany.
Podobnie na kliencie System.ServiceModel.Description.ServiceEndpoint wartości nie mogą być modyfikowane po wywołaniu OnOpeningSystem.ServiceModel.ChannelFactorymetody na . Właściwość ChannelFactory.Credentials zgłasza wyjątek, jeśli został zmodyfikowany obok tego punktu, ale inne wartości opisu klienta można modyfikować bez błędu. Wynik jest jednak niezdefiniowany.
Niezależnie od tego, czy jest to usługa, czy klient, zaleca się zmodyfikowanie opisu przed wywołaniem metody CommunicationObject.Open.
Reguły dziedziczenia dla atrybutów zachowania
Wszystkie cztery typy zachowań można wypełnić za pomocą atrybutów — zachowania usługi i zachowania kontraktu. Ponieważ atrybuty są definiowane na zarządzanych obiektach i elementach członkowskich, a zarządzane obiekty i elementy członkowskie obsługują dziedziczenie, należy zdefiniować sposób działania atrybutów zachowania w kontekście dziedziczenia.
Na wysokim poziomie reguła jest taka, że dla określonego zakresu (na przykład usługi, kontraktu lub operacji) są stosowane wszystkie atrybuty zachowania w hierarchii dziedziczenia dla tego zakresu. Jeśli istnieją dwa atrybuty zachowania tego samego typu, używany jest tylko najbardziej pochodny typ.
Zachowania usługi
Dla danej klasy usługi są stosowane wszystkie atrybuty zachowania usługi w tej klasie oraz elementy nadrzędne tej klasy. Jeśli ten sam typ atrybutu jest stosowany w wielu miejscach w hierarchii dziedziczenia, najczęściej używany jest typ pochodny.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
[AspNetCompatibilityRequirementsAttribute(
AspNetCompatibilityRequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class A { /* … */ }
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class B : A { /* … */}
Na przykład w poprzednim przypadku usługa B kończy się ciągiem , trybem Allowed, i wartością ConcurrencyModeSingle.AspNetCompatibilityRequirementsModeInstanceContextModeSingle Jest to ConcurrencyMode , ponieważ ServiceBehaviorAttribute atrybut w usłudze B jest na "bardziej pochodne" niż w usłudze SingleA.
Zachowania kontraktu
W przypadku danego kontraktu stosowane są wszystkie atrybuty zachowania kontraktu w tym interfejsie i na elementach nadrzędnych tego interfejsu. Jeśli ten sam typ atrybutu jest stosowany w wielu miejscach w hierarchii dziedziczenia, najczęściej używany jest typ pochodny.
Zachowania operacji
Jeśli dana operacja nie zastępuje istniejącej operacji abstrakcyjnej ani wirtualnej, nie mają zastosowania żadne reguły dziedziczenia.
Jeśli operacja zastąpi istniejącą operację, zostaną zastosowane wszystkie atrybuty zachowania operacji dla tej operacji i elementy nadrzędne tej operacji. Jeśli ten sam typ atrybutu jest stosowany w wielu miejscach w hierarchii dziedziczenia, najczęściej używany jest typ pochodny.