Niestandardowy element przechwytujący komunikaty
Przykład MessageInterceptor demonstruje użycie modelu rozszerzalności kanału. W szczególności pokazuje, jak zaimplementować niestandardowy element powiązania, który tworzy fabryki kanałów i odbiorniki kanału w celu przechwycenia wszystkich przychodzących i wychodzących komunikatów w określonym punkcie w stosie czasu wykonywania. Przykład obejmuje również klienta i serwer, który demonstruje użycie tych fabryk niestandardowych.
W tym przykładzie zarówno klient, jak i usługa to programy konsolowe (.exe). Klient i usługa korzystają z biblioteki wspólnej (.dll), która zawiera niestandardowy element powiązania i skojarzone z nim obiekty czasu wykonywania.
Uwaga
Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.
W przykładzie opisano zalecaną procedurę tworzenia niestandardowego kanału warstwowego w programie Windows Communication Foundation (WCF), korzystając ze struktury kanału i postępując zgodnie z najlepszymi rozwiązaniami dotyczącymi programu WCF. Kroki tworzenia niestandardowego kanału warstwowego są następujące:
Zdecyduj, który z kanałów kształtuje fabrykę kanałów, a odbiornik kanału będzie obsługiwał.
Utwórz fabrykę kanałów i odbiornik kanału, który obsługuje kształty kanału.
Dodaj element powiązania, który dodaje niestandardowy kanał warstwowy do stosu kanału.
Dodaj sekcję rozszerzenia elementu powiązania, aby uwidocznić nowy element powiązania w systemie konfiguracji.
Kształty kanału
Pierwszym krokiem podczas pisania niestandardowego kanału warstwowego jest podjęcie decyzji, które kształty są wymagane dla kanału. Dla naszego inspektora komunikatów obsługujemy dowolny kształt, który obsługuje warstwa poniżej (na przykład jeśli warstwa poniżej nas może kompilować IOutputChannel , a IDuplexSessionChannelnastępnie ujawniamy IOutputChannelIDuplexSessionChanneli ).
Fabryka kanałów i fabryka odbiorników
Następnym krokiem podczas pisania niestandardowego kanału warstwowego jest utworzenie implementacji IChannelFactory kanałów klienta i kanałów IChannelListener usług.
Te klasy przyjmują wewnętrzną fabrykę i odbiornik oraz deleguj wszystkie, ale OnCreateChannel
i OnAcceptChannel
wywołuje do wewnętrznej fabryki i odbiornika.
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
//...
}
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
//...
}
Dodawanie elementu powiązania
W przykładzie zdefiniowano niestandardowy element powiązania: InterceptingBindingElement
. InterceptingBindingElement
ChannelMessageInterceptor
przyjmuje jako dane wejściowe i używa go ChannelMessageInterceptor
do manipulowania komunikatami przekazywanymi przez nie. Jest to jedyna klasa, która musi być publiczna. Wszystkie fabryki, odbiornika i kanały mogą być wewnętrznymi implementacjami publicznych interfejsów czasu wykonywania.
public class InterceptingBindingElement : BindingElement
{
}
Dodawanie obsługi konfiguracji
Aby zintegrować z konfiguracją powiązania, biblioteka definiuje procedurę obsługi sekcji konfiguracji jako sekcję rozszerzenia elementu powiązania. Pliki konfiguracji klienta i serwera muszą zarejestrować rozszerzenie elementu powiązania w systemie konfiguracji. Implementacje, które chcą uwidocznić ich element powiązania w systemie konfiguracji, mogą pochodzić z tej klasy.
public abstract class InterceptingElement : BindingElementExtensionElement
{
//...
}
Dodawanie zasad
Aby zintegrować z naszym systemem zasad, InterceptingBindingElement
implementuje interfejs IPolicyExportExtension, aby zasygnalizować, że powinniśmy uczestniczyć w generowaniu zasad. Aby obsługiwać importowanie zasad na wygenerowanym kliencieCreateMessageInterceptor
, użytkownik może zarejestrować klasę pochodną klasy i zastąpić () w celu wygenerowania klasy obsługującej ChannelMessageInterceptor
InterceptingBindingElementImporter
zasady.
Przykład: Droppable Message Inspector
W przykładzie znajduje się przykładowa implementacja ChannelMessageInspector
, która powoduje porzucenie komunikatów.
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
Dostęp do niego można uzyskać z poziomu konfiguracji w następujący sposób:
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
Klient i serwer używają tej nowo utworzonej sekcji konfiguracji, aby wstawić fabryki niestandardowe do najniższego poziomu stosów kanałów czasu wykonywania (powyżej poziomu transportu).
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
Klient używa MessageInterceptor
biblioteki do dodawania niestandardowego nagłówka do parzysty komunikatów numerowanych. Z drugiej strony usługa używa MessageInterceptor
biblioteki do porzucania komunikatów, które nie mają tego specjalnego nagłówka.
Po uruchomieniu usługi powinny zostać wyświetlone następujące dane wyjściowe klienta, a następnie klient.
Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client
Klient zgłasza 10 różnych prędkości wiatru do usługi, ale tylko taguje połowę z nich z nagłówkiem specjalnym.
W usłudze powinny zostać wyświetlone następujące dane wyjściowe:
Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.
Aby skonfigurować, skompilować i uruchomić przykład
Zainstaluj ASP.NET 4.0 przy użyciu następującego polecenia.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.
Aby skompilować rozwiązanie, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).
Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.
Uruchom Service.exe najpierw uruchom Client.exe i obejrzyj oba okna konsoli w celu uzyskania danych wyjściowych.