Udostępnij za pośrednictwem


Niestandardowe kodery

W tym temacie omówiono sposób tworzenia koderów niestandardowych.

W programie Windows Communication Foundation (WCF) należy użyć powiązania , aby określić sposób przesyłania danych między punktami końcowymi. Powiązanie składa się z sekwencji elementów powiązania. Powiązanie zawiera opcjonalne elementy powiązania protokołu, takie jak zabezpieczenia, wymagany element powiązania kodera komunikatów i wymagany element powiązania transportu. Koder komunikatów jest reprezentowany przez element powiązania kodowania komunikatów. Wcf znajdują się trzy kodery komunikatów: binarny, mechanizm optymalizacji transmisji komunikatów (MTOM) i tekst.

Element powiązania kodowania komunikatów serializuje wychodzące Message i przekazuje go do transportu lub odbiera serializowaną formę komunikatu z transportu i przekazuje go do warstwy protokołu, jeśli istnieje, lub do aplikacji, jeśli nie istnieje.

Kodery komunikatów przekształcają Message wystąpienia do i z reprezentacji przewodu. Mimo że kodery są opisane jako siedzące nad warstwą transportu w stosie kanału, znajdują się wewnątrz warstwy transportu. Transporty (na przykład HTTP) formatować komunikat zgodnie z wymaganiami standardu transportu. Kodery (na przykład Tekst xml) po prostu kodują komunikat.

Podczas nawiązywania połączenia z wcześniej istniejącego klienta lub serwera może nie być konieczne użycie określonego kodowania komunikatów. Jednak usługi WCF mogą być dostępne za pośrednictwem wielu punktów końcowych, z których każdy ma inny koder komunikatów. Jeśli pojedynczy koder nie obejmuje całej grupy odbiorców usługi, rozważ uwidocznienie usługi za pośrednictwem wielu punktów końcowych. Aplikacje klienckie mogą następnie wybrać punkt końcowy, który jest dla nich najlepszy. Korzystanie z wielu punktów końcowych umożliwia łączenie zalet różnych koderów komunikatów z innymi elementami powiązania.

Kodery dostarczone przez system

Program WCF udostępnia kilka powiązań dostarczanych przez system, które są przeznaczone do obsługi najbardziej typowych scenariuszy aplikacji. Każde z tych powiązań łączy transport, koder komunikatów i inne opcje (na przykład zabezpieczenia). W tym temacie opisano sposób rozszerzania Textkoderów komunikatów , i BinaryMTOM zawartych w programie WCF lub tworzenia własnego kodera niestandardowego. Koder komunikatów tekstowych obsługuje zarówno zwykłe kodowanie XML, jak i kodowanie SOAP. Zwykły tryb kodowania XML kodera komunikatów tekstowych jest nazywany koderem POX ("Zwykły stary kod XML"), aby odróżnić go od kodowania SOAP opartego na tekście.

Aby uzyskać więcej informacji na temat kombinacji elementów powiązania dostarczonych przez powiązania dostarczone przez system, zobacz odpowiednią sekcję w temacie Wybieranie transportu.

Jak pracować z koderami dostarczanymi przez system

Kodowanie jest dodawane do powiązania przy użyciu klasy pochodzącej z MessageEncodingBindingElementklasy .

Program WCF udostępnia następujące typy elementów powiązań pochodzących z MessageEncodingBindingElement klasy, które mogą zapewnić kodowanie mechanizmu optymalizacji tekstu, binarnej i transmisji komunikatów (MTOM):

  • TextMessageEncodingBindingElement: Najbardziej współdziałalny, ale najmniej wydajny koder dla komunikatów XML. Usługa sieci Web lub klient usługi sieci Web zazwyczaj rozumie tekstowy kod XML. Jednak przesyłanie dużych bloków danych binarnych, ponieważ tekst nie jest wydajny.

  • BinaryMessageEncodingBindingElement: reprezentuje element powiązania, który określa kodowanie znaków i przechowywanie wersji komunikatów używanych dla komunikatów XML opartych na binarnej bazie danych. Jest to najbardziej wydajne opcje kodowania, ale najmniej współdziałanie, ponieważ jest obsługiwane tylko przez punkty końcowe programu WCF.

  • MtomMessageEncodingBindingElement: reprezentuje element powiązania, który określa kodowanie znaków i przechowywanie wersji komunikatów używanych dla komunikatu przy użyciu kodowania mechanizmu optymalizacji transmisji komunikatów (MTOM). MTOM to wydajna technologia przesyłania danych binarnych w komunikatach WCF. Koder MTOM próbuje zrównoważyć wydajność i współdziałanie. Kodowanie MTOM przesyła większość kodu XML w postaci tekstowej, ale optymalizuje duże bloki danych binarnych, przesyłając je tak jak w przypadku, bez konwersji na tekst.

Element powiązania tworzy plik binarny, MTOM lub tekst MessageEncoderFactory. Fabryka tworzy wystąpienie binarne, MTOM lub tekstowe MessageEncoderFactory . Zazwyczaj istnieje tylko jedno wystąpienie. Jeśli jednak sesje są używane, do każdej sesji może być udostępniany inny koder. Koder binarny wykorzystuje to do koordynowania słowników dynamicznych (zobacz Infrastruktura XML).

Metody ReadMessage i WriteMessage są rdzeniem koderów. Metody umożliwiają odczytywanie komunikatu ze strumienia lub tablicy Byte . Tablice bajtów są używane, gdy transport działa w trybie buforowym. Komunikaty są zawsze zapisywane w strumieniach. Jeśli transport musi buforować komunikat, udostępnia strumień, który wykonuje buforowanie.

Pozostałe elementy członkowskie współpracują z obsługą zawartości, typów multimediów i MessageVersion. Transport wywołuje te metody kodera, aby sprawdzić, czy komunikat przychodzący może zostać zdekodowany przez niego, czy też określić, czy komunikat wychodzący jest prawidłowy dla tego kodera.

Każda z trzech implementacji kodera dodaje właściwości, które są istotne dla określonych kodowań i jest w pełni konfigurowalne. Kodery uwidaczniają również limity przydziału czytelnika, które mają bezpieczne wartości domyślne. Zobacz Infrastruktura XML, aby zapoznać się z omówieniem limitów przydziału.

Funkcje koderów dostarczanych przez system

Istnieje wiele funkcji udostępnianych przez kodery dostarczane przez system.

Buforowanie

Każda implementacja kodera próbuje pulować jak najwięcej. Zmniejszenie alokacji to kluczowy sposób na poprawę wydajności kodu zarządzanego. Aby wykonać tę pulę, implementacje używają SynchronizedPool klasy . Plik C# zawiera opis dodatkowych optymalizacji używanych przez tę klasę.

XmlDictionaryReader wystąpienia i XmlDictionaryWriter są w puli i ponownie inicjowane, aby zapobiec przydzielaniu nowych dla każdego komunikatu. W przypadku czytelników wywołanie OnClose zwrotne odzyskuje czytnik po Close() wywołaniu. Koder przetwarza również niektóre obiekty stanu komunikatów używane podczas konstruowania komunikatów. Rozmiary tych pul można konfigurować za pomocą MaxReadPoolSize właściwości i MaxWritePoolSize dla każdej z trzech klas pochodzących z MessageEncodingBindingElementklasy .

Kodowanie binarne

Gdy kodowanie binarne używa sesji, ciąg słownika dynamicznego musi być przekazywany do odbiorcy komunikatu. Odbywa się to przez prefiksowanie komunikatu z ciągami słownika dynamicznego. Odbiornik usuwa ciągi, dodaje je do sesji i przetwarza komunikat. Prawidłowe przekazywanie ciągów słownika wymaga buforowanego transportu.

Ciągi są dołączane do komunikatu za pomocą metody wewnętrznej AddSessionInformationToMessage . Dodaje ciągi jako UTF-8 do przodu komunikatu poprzedzonego ich długością. Cały nagłówek słownika jest następnie poprzedzony długością danych. Operacja odwrotna jest wykonywana przez metodę wewnętrzną ExtractSessionInformationFromMessage .

Oprócz przetwarzania dynamicznych kluczy słownika buforowane komunikaty sesji są odbierane w unikatowy sposób. Zamiast tworzyć czytelnika w dokumencie i przetwarzać go, koder binarny używa klasy wewnętrznej MessagePatterns do dekonstrukcji strumienia binarnego. Chodzi o to, że większość komunikatów ma określony zestaw nagłówków, które są wyświetlane w określonej kolejności po wygenerowaniu przez usługę WCF. System wzorców dzieli komunikat na podstawie tego, czego oczekuje. Jeśli operacja zakończy się pomyślnie, inicjuje MessageHeaders obiekt bez analizowania kodu XML. Jeśli nie, wraca do standardowej metody.

Kodowanie MTOM

Klasa MtomMessageEncodingBindingElement ma dodatkową właściwość konfiguracji o nazwie MaxBufferSize. Spowoduje to umieszczenie górnej granicy ilości danych, które mogą buforować podczas procesu odczytywania komunikatu. Może być konieczne buforowania zestawu informacji XML (Infoset) lub innych części MIME, aby ponownie połączyć wszystkie części MIME w jeden komunikat.

Aby prawidłowo pracować z protokołem HTTP, wewnętrzna klasa kodera komunikatów MTOM udostępnia pewne wewnętrzne interfejsy GetContentType API (które są również wewnętrzne) i WriteMessage, które są publiczne i mogą zostać zastąpione. Aby zapewnić, że wartości w nagłówkach HTTP zgadzają się z wartościami w nagłówkach MIME, musi wystąpić więcej komunikacji.

Wewnętrznie koder komunikatów MTOM używa czytników tekstu WCF i jest podobny do kodera tekstowego. Główną różnicą jest to, że optymalizuje duże fragmenty danych binarnych lub "Binarne duże obiekty" (BLOB), nie konwertując ich na kodowanie Base-64 przed osadzonymi w bajtach komunikatów. Zamiast tego te obiekty BLOB są wyodrębniane i przywoływane jako załączniki MIME.

Pisanie własnego kodera

Aby zaimplementować własny niestandardowy koder komunikatów, należy podać niestandardowe implementacje następujących abstrakcyjnych klas bazowych:

Konwertowanie z reprezentacji w pamięci komunikatu na reprezentację, którą można zapisać w strumieniu, jest hermetyzowane w MessageEncoder klasie, która służy jako fabryka czytników XML i składników zapisywania XML, które obsługują określone typy kodowań XML.

Jest to kod, który piszesz w tych metodach, który obsługuje konwersję między standardowym protokołem transportowym i dostosowanym kodowaniem.

Następnie należy kodować klasę fabryki, która tworzy koder niestandardowy. Zastąpi element , Encoder aby zwrócić wystąpienie niestandardowego MessageEncoderobiektu .

Następnie połącz niestandardowy MessageEncoderFactory stos elementów powiązania używany do skonfigurowania usługi lub klienta, przesłaniając CreateMessageEncoderFactory metodę w celu zwrócenia wystąpienia tej fabryki.

Istnieją dwa przykłady dostarczane z usługą WCF, które ilustrują ten proces za pomocą przykładowego kodu: Custom Message Encoder: Custom Text Encoder i Custom Message Encoder: Compression Encoder.

Zobacz też