Rozszerzanie dyspozytorów

Dyspozytorzy są odpowiedzialni za ściąganie przychodzących komunikatów z źródłowych kanałów, tłumaczenie ich na wywołania metod w kodzie aplikacji i wysyłanie wyników z powrotem do obiektu wywołującego. Rozszerzenia dyspozytora umożliwiają modyfikowanie tego przetwarzania. Można zaimplementować inspektorów komunikatów lub parametrów, które sprawdzają lub modyfikują zawartość komunikatów lub parametrów. Możesz zmienić sposób kierowania komunikatów do operacji lub udostępnić inne funkcje.

W tym temacie opisano sposób używania DispatchRuntime klas i DispatchOperation w aplikacji usługi Windows Communication Foundation (WCF) w celu zmodyfikowania domyślnego zachowania wykonywania dyspozytora lub przechwytywania lub modyfikowania komunikatów, parametrów lub zwracania wartości przed wysłaniem lub pobraniem ich z warstwy kanału. Aby uzyskać więcej informacji na temat równoważnego przetwarzania komunikatów środowiska uruchomieniowego klienta, zobacz Rozszerzanie klientów. Aby zrozumieć rolę, jaką IExtensibleObject<T> typy odgrywają w uzyskiwaniu dostępu do stanu współużytkowanego między różnymi obiektami dostosowywania środowiska uruchomieniowego, zobacz Extensible Objects (Rozszerzalne obiekty).

Dystrybucja

Warstwa modelu usług wykonuje konwersję między modelem programowania dewelopera a bazową wymianą komunikatów, często nazywaną warstwą kanału. W programie WCF dyspozytorów kanałów i punktów końcowych (ChannelDispatcher i EndpointDispatcher, odpowiednio) są składnikami usługi odpowiedzialnymi za akceptowanie nowych kanałów, odbieranie komunikatów, wysyłanie operacji i wywoływanie oraz przetwarzanie odpowiedzi. Obiekty dyspozytora to obiekty odbiorcy, ale implementacje kontraktów wywołania zwrotnego w usługach dwudupleksowych uwidaczniają również obiekty dyspozytora do inspekcji, modyfikacji lub rozszerzenia.

Dyspozytor kanału (i towarzysz IChannelListener) ściąga komunikaty z kanału podwładnego i przekazuje komunikaty do odpowiednich dyspozytorów punktów końcowych. Każdy dyspozytor punktu końcowego ma element DispatchRuntime , który kieruje komunikaty do odpowiedniego DispatchOperationelementu , który jest odpowiedzialny za wywołanie metody implementujące operację. Różne opcjonalne i wymagane klasy rozszerzeń są wywoływane po drodze. W tym temacie wyjaśniono, jak te elementy pasują do siebie i jak można modyfikować właściwości i podłączać własny kod, aby rozszerzyć funkcjonalność podstawową.

Właściwości dyspozytora i zmodyfikowane obiekty dostosowywania są wstawiane przy użyciu obiektów zachowania usługi, punktu końcowego, kontraktu lub operacji. W tym temacie nie opisano sposobu używania zachowań. Aby uzyskać więcej informacji na temat typów używanych do wstawiania modyfikacji dyspozytora, zobacz Konfigurowanie i rozszerzanie środowiska uruchomieniowego przy użyciu zachowań.

Poniższa grafika zawiera ogólny widok elementów architektury w usłudze.

The dispatch runtime architecture

Dyspozytorzy kanałów

Obiekt ChannelDispatcher jest tworzony w celu skojarzenia określonego IChannelListener identyfikatora URI (nazywanego identyfikatorem URI nasłuchiwania) z wystąpieniem usługi. Każdy ServiceHost obiekt może mieć wiele ChannelDispatcher obiektów, z których każdy jest skojarzony tylko z jednym odbiornikiem i identyfikatorem URI nasłuchiwania. Po nadejściu komunikatu wysyła zapytanie do każdego ze skojarzonych EndpointDispatcher obiektów, ChannelDispatcher czy punkt końcowy może zaakceptować komunikat, i przekazuje komunikat do tego, który może.

Wszystkie właściwości kontrolujące okres istnienia i zachowanie sesji kanału są dostępne do inspekcji lub modyfikacji ChannelDispatcher obiektu. Należą do nich niestandardowe inicjatory kanałów, odbiornik kanału, host, skojarzony element InstanceContexti tak dalej.

Dyspozytorzy punktów końcowych

Obiekt EndpointDispatcher jest odpowiedzialny za przetwarzanie komunikatów z adresu docelowego komunikatu zgodnego AddressFilter z ChannelDispatcher właściwością , a akcja komunikatu jest zgodna z właściwością ContractFilter . Jeśli dwa EndpointDispatcher obiekty mogą zaakceptować komunikat, FilterPriority wartość właściwości określa punkt końcowy o wyższym priorytcie.

Użyj elementu EndpointDispatcher , aby uzyskać dwa główne punkty rozszerzenia modelu usługi — DispatchRuntime klasy i DispatchOperation — które można użyć do dostosowania przetwarzania dyspozytora. Klasa DispatchRuntime umożliwia użytkownikom przechwytywanie i rozszerzanie dyspozytora w zakresie kontraktu (czyli dla wszystkich komunikatów w umowie). Klasa DispatchOperation umożliwia użytkownikom przechwytywanie i rozszerzanie dyspozytora w zakresie operacji (czyli dla wszystkich komunikatów w operacji).

Scenariusze

Istnieje wiele powodów rozszerzenia dyspozytora:

  • Walidacja niestandardowego komunikatu. Użytkownicy mogą wymusić, że komunikat jest prawidłowy dla określonego schematu. Można to zrobić, implementując interfejsy przechwytywania komunikatów. Aby zapoznać się z przykładem, zobacz Inspektorzy komunikatów.

  • Niestandardowe rejestrowanie komunikatów. Użytkownicy mogą sprawdzać i rejestrować niektóre komunikaty aplikacji, które przepływają przez punkt końcowy. Można to również osiągnąć za pomocą interfejsów przechwytywania komunikatów.

  • Niestandardowe przekształcenia komunikatów. Użytkownicy mogą stosować pewne przekształcenia do komunikatu w środowisku uruchomieniowym (na przykład w przypadku przechowywania wersji). Można to zrobić ponownie za pomocą interfejsów przechwytywania komunikatów.

  • Niestandardowy model danych. Użytkownicy mogą mieć model serializacji danych inny niż te obsługiwane domyślnie w programie WCF (a mianowicie , System.Runtime.Serialization.DataContractSerializer, System.Xml.Serialization.XmlSerializeri nieprzetworzonych komunikatów). Można to zrobić, implementując interfejsy formatatora komunikatów. Aby zapoznać się z przykładem, zobacz Operation Formatter (Formatowanie operacji) i Operation Selector (Selektor operacji).

  • Walidacja parametru niestandardowego. Użytkownicy mogą wymusić, że wpisane parametry są prawidłowe (w przeciwieństwie do xml). Można to zrobić przy użyciu interfejsów inspektora parametrów.

  • Wysyłanie operacji niestandardowych. Użytkownicy mogą implementować wysyłanie na coś innego niż akcja — na przykład w elemenie treści lub w niestandardowej właściwości komunikatu. Można to zrobić przy użyciu interfejsu IDispatchOperationSelector . Aby zapoznać się z przykładem, zobacz Operation Formatter (Formatowanie operacji) i Operation Selector (Selektor operacji).

  • Buforowanie obiektów. Użytkownicy mogą pulować wystąpienia zamiast przydzielać nowe dla każdego wywołania. Można to zaimplementować przy użyciu interfejsów dostawcy wystąpień. Aby zapoznać się z przykładem, zobacz Buforowanie.

  • Dzierżawa wystąpień. Użytkownicy mogą zaimplementować wzorzec dzierżawy dla okresu istnienia wystąpienia, podobnie jak w przypadku komunikacji wirtualnej programu .NET Framework. Można to zrobić przy użyciu interfejsów okresu istnienia kontekstu wystąpienia.

  • Niestandardowa obsługa błędów. Użytkownicy mogą kontrolować, jak są przetwarzane zarówno błędy lokalne, jak i jak błędy są przekazywane z powrotem do klientów. Można to zaimplementować przy użyciu IErrorHandler interfejsów.

  • Niestandardowe zachowania autoryzacji. Użytkownicy mogą implementować niestandardową kontrolę dostępu przez rozszerzenie fragmentów czasu wykonywania kontraktu lub operacji i dodanie kontroli zabezpieczeń na podstawie tokenów znajdujących się w komunikacie. Można to osiągnąć przy użyciu interfejsów przechwytywania komunikatów lub przechwytywania parametrów. Przykłady można znaleźć w temacie Rozszerzalność zabezpieczeń.

    Uwaga

    Ze względu na to, że zmiana właściwości zabezpieczeń może naruszyć bezpieczeństwo aplikacji WCF, zdecydowanie zaleca się podjęcie modyfikacji związanych z zabezpieczeniami z ostrożnością i dokładne przetestowanie przed wdrożeniem.

  • Niestandardowe moduły sprawdzania poprawności środowiska uruchomieniowego programu WCF. Można zainstalować niestandardowe moduły sprawdzania poprawności, które badają usługi, kontrakty i powiązania, aby wymuszać zasady na poziomie przedsiębiorstwa w odniesieniu do aplikacji WCF. (Na przykład zobacz Instrukcje: blokowanie punktów końcowych w przedsiębiorstwie).

Korzystanie z klasy DispatchRuntime

DispatchRuntime Użyj klasy , aby zmodyfikować domyślne zachowanie usługi lub pojedynczego punktu końcowego albo wstawić obiekty implementujące niestandardowe modyfikacje do jednego lub obu następujących procesów usługi (lub procesów klienta w przypadku klienta dwustronnego):

  • Przekształcanie przychodzących komunikatów w obiekty i zwalnianie tych obiektów jako wywołań metod na obiekcie usługi.

  • Przekształcanie obiektów odebranych z odpowiedzi na wywołanie operacji usługi do komunikatów wychodzących.

Umożliwia DispatchRuntime przechwycenie i rozszerzenie dyspozytora kanału lub punktu końcowego dla wszystkich komunikatów w ramach określonego kontraktu, nawet jeśli komunikat nie jest rozpoznawany. Gdy pojawi się komunikat, który nie jest zgodny z żadnym zadeklarowanym w kontrakcie, jest wysyłany do operacji zwracanej przez UnhandledDispatchOperation właściwość. Aby przechwycić lub rozszerzyć wszystkie komunikaty dla określonej operacji, zobacz klasę DispatchOperation .

Istnieją cztery główne obszary rozszerzalności dyspozytora uwidocznione przez klasę DispatchRuntime :

  1. Składniki kanału używają właściwości DispatchRuntime i skojarzonych dyspozytorów kanałów zwróconych przez ChannelDispatcher właściwość, aby dostosować sposób akceptowania i zamykania kanałów przez dyspozytora kanałów. Ta kategoria zawiera ChannelInitializers właściwości i InputSessionShutdownHandlers .

  2. Składniki komunikatów są dostosowywane dla każdego przetworzonego komunikatu. Ta kategoria zawiera MessageInspectorswłaściwości , OperationSelector, Operationsi ErrorHandlers .

  3. Składniki wystąpienia dostosowują tworzenie, okres istnienia i usuwanie wystąpień typu usługi. Aby uzyskać więcej informacji na temat okresów istnienia obiektów usługi, zobacz InstanceContextMode właściwość . Ta kategoria zawiera InstanceContextInitializers właściwości i InstanceProvider .

  4. Składniki związane z zabezpieczeniami mogą używać następujących właściwości:

Zazwyczaj niestandardowe obiekty rozszerzenia są przypisywane do DispatchRuntime właściwości lub wstawiane do kolekcji przez zachowanie usługi (obiekt implementujący IServiceBehavior), zachowanie kontraktu (obiekt implementujący IContractBehavior) lub zachowanie punktu końcowego (obiekt implementujący IEndpointBehavior). Następnie obiekt zachowania instalowania jest dodawany do odpowiedniej kolekcji zachowań programowo lub przez zaimplementowanie obiektu niestandardowego BehaviorExtensionElement w celu umożliwienia wstawienia zachowania przy użyciu pliku konfiguracji aplikacji.

Klienci dwukierunkowi (klienci implementujący kontrakt wywołania zwrotnego określonego przez usługę dwukierunkową DispatchRuntime ) mają również obiekt, do którego można uzyskać dostęp przy użyciu CallbackDispatchRuntime właściwości .

Używanie klasy DispatchOperation

Klasa DispatchOperation jest lokalizacją modyfikacji w czasie wykonywania i punktem wstawiania dla rozszerzeń niestandardowych, które mają zakres tylko do jednej operacji usługi. (Aby zmodyfikować zachowanie czasu wykonywania usługi dla wszystkich komunikatów w umowie, użyj DispatchRuntime klasy ).

Zainstaluj DispatchOperation modyfikacje przy użyciu niestandardowego obiektu zachowania usługi.

Użyj właściwości , Operations aby zlokalizować DispatchOperation obiekt reprezentujący określoną operację usługi.

Następujące właściwości kontrolują wykonywanie środowiska uruchomieniowego na poziomie operacji:

Zobacz też