Niestandardowe uaktualnienia strumienia
Transporty zorientowane na strumień, takie jak TCP i nazwane potoki, działają na ciągłym strumieniu bajtów między klientem a serwerem. Ten strumień jest zrealizowany Stream przez obiekt. W ramach uaktualnienia strumienia klient chce dodać opcjonalną warstwę protokołu do stosu kanału i prosi o to inny koniec kanału komunikacyjnego. Uaktualnienie strumienia polega na zastąpieniu oryginalnego Stream obiektu uaktualnionym.
Można na przykład utworzyć strumień kompresji bezpośrednio na strumieniu transportu. W takim przypadku oryginalny transport Stream jest zastępowany jednym, który owija kompresję Stream wokół oryginalnego.
Można zastosować wiele uaktualnień strumieni, z których każdy opakowuje poprzednie.
Jak działają uaktualnienia strumienia
Proces uaktualniania strumienia zawiera cztery składniki.
Inicjator strumienia uaktualnienia rozpoczyna proces: w czasie wykonywania może zainicjować żądanie na drugim końcu połączenia w celu uaktualnienia warstwy transportu kanału.
Akceptowanie strumienia uaktualnienia wykonuje uaktualnienie: w czasie wykonywania odbiera żądanie uaktualnienia z innej maszyny, a jeśli to możliwe, akceptuje uaktualnienie.
Dostawca uaktualniania tworzy inicjatora na kliencie i elementy akceptujące na serwerze.
Element powiązania uaktualnienia strumienia jest dodawany do powiązań usługi i klienta oraz tworzy dostawcę w czasie wykonywania.
Należy pamiętać, że w przypadku wielu uaktualnień inicjator i akmetyzator hermetyzują maszyny stanu, aby wymusić, które przejścia uaktualnienia są prawidłowe dla każdej inicjacji.
Jak zaimplementować uaktualnienie strumienia
Program Windows Communication Foundation (WCF) udostępnia cztery abstract
klasy, które można zaimplementować:
Aby zaimplementować niestandardowe uaktualnienie strumienia, wykonaj następujące czynności. Ta procedura implementuje minimalny proces uaktualniania strumienia na komputerach klienckich i serwerowych.
Utwórz klasę, która implementuje StreamUpgradeInitiator.
Zastąpij metodę InitiateUpgrade , aby przejąć strumień do uaktualnienia i zwrócić uaktualniony strumień. Ta metoda działa synchronicznie; Istnieją analogiczne metody inicjowania uaktualnienia asynchronicznie.
Zastąpij metodę GetNextUpgrade , aby sprawdzić dodatkowe uaktualnienia.
Utwórz klasę, która implementuje StreamUpgradeAcceptor.
Zastąpij metodę AcceptUpgrade , aby przejąć strumień do uaktualnienia i zwrócić uaktualniony strumień. Ta metoda działa synchronicznie; Istnieją analogiczne metody akceptowania uaktualnienia asynchronicznie.
Zastąpi metodę CanUpgrade w celu określenia, czy żądane uaktualnienie jest obsługiwane przez ten akceptowany uaktualnienia w tym momencie w procesie uaktualniania.
Utwórz klasę implementuje StreamUpgradeProviderelement . Zastąpij CreateUpgradeAcceptor metody i CreateUpgradeInitiator , aby zwracać wystąpienia akceptowania i inicjatora zdefiniowane w krokach 2 i 1.
Utwórz klasę, która implementuje StreamUpgradeBindingElement.
Zastąpi metodę BuildClientStreamUpgradeProvider na kliencie i BuildServerStreamUpgradeProvider metodę w usłudze.
Zastąpij metodę BuildChannelFactory na kliencie i BuildChannelListener metodę w usłudze, aby dodać element powiązania uaktualnienia do BindingParameterselementu .
Dodaj nowy element powiązania uaktualnienia strumienia do powiązań na serwerze i maszynach klienckich.
Uaktualnienia zabezpieczeń
Dodanie uaktualnienia zabezpieczeń to wyspecjalizowana wersja ogólnego procesu uaktualniania strumienia.
Program WCF udostępnia już dwa elementy powiązania na potrzeby uaktualniania zabezpieczeń strumienia. Konfiguracja zabezpieczeń na poziomie transportu jest hermetyzowana przez WindowsStreamSecurityBindingElement element i SslStreamSecurityBindingElement , który można skonfigurować i dodać do powiązania niestandardowego. Te elementy powiązania rozszerzają klasę StreamUpgradeBindingElement , która kompiluje dostawców uaktualnienia klienta i strumienia serwera. Te elementy powiązania mają metody, które tworzą wyspecjalizowane klasy dostawcy uaktualniania strumienia zabezpieczeń, które nie public
są , więc w tych dwóch przypadkach wystarczy dodać element powiązania do powiązania.
W przypadku scenariuszy zabezpieczeń, które nie zostały spełnione przez powyższe dwa elementy powiązania, trzy klasy związane z abstract
zabezpieczeniami pochodzą z powyższych klas inicjatora, akceptowania i klas bazowych dostawcy:
Proces implementowania uaktualnienia strumienia zabezpieczeń jest taki sam jak poprzednio, z różnicą, która wynika z tych trzech klas. Zastąpi dodatkowe właściwości w tych klasach, aby dostarczyć informacje o zabezpieczeniach do środowiska uruchomieniowego.
Wiele uaktualnień
Aby utworzyć dodatkowe żądania uaktualnienia, powtórz powyższy proces: utwórz dodatkowe rozszerzenia StreamUpgradeProvider elementów i powiązania. Dodaj elementy powiązania do powiązania. Dodatkowe elementy powiązania są przetwarzane sekwencyjnie, począwszy od pierwszego elementu powiązania dodanego do powiązania. W BuildChannelFactory programie i BuildChannelListener każdy dostawca uaktualnienia może określić, jak warstwować się na dowolnych wstępnie istniejących parametrów powiązania uaktualnienia. Następnie należy zastąpić istniejący parametr powiązania uaktualnienia nowym parametrem powiązania uaktualnienia złożonego.
Alternatywnie jeden dostawca uaktualnienia może obsługiwać wiele uaktualnień. Możesz na przykład zaimplementować niestandardowego dostawcę uaktualnienia strumienia, który obsługuje zarówno zabezpieczenia, jak i kompresję. Wykonaj poniższe kroki:
Podklasa StreamSecurityUpgradeProvider do zapisu klasy dostawcy, która tworzy inicjator i acceptor.
Podklasa StreamSecurityUpgradeInitiator upewniając się, że zastąpisz metodę GetNextUpgrade , aby zwrócić typy zawartości strumienia kompresji i bezpieczny strumień w kolejności.
Podklasa StreamSecurityUpgradeAcceptor , która rozumie niestandardowe typy zawartości w swojej CanUpgrade metodzie.
Strumień zostanie uaktualniony po każdym wywołaniu metody GetNextUpgrade i CanUpgrade.