Aangepaste streamupgrades
Streamgeoriënteerde transporten zoals TCP en Named Pipes werken op een continue stroom van bytes tussen de client en de server. Deze stroom wordt gerealiseerd door een Stream object. In een streamupgrade wil de client een optionele protocollaag toevoegen aan de kanaalstack en vraagt de andere kant van het communicatiekanaal dit te doen. De streamupgrade bestaat uit het vervangen van het oorspronkelijke Stream object door een upgrade.
U kunt bijvoorbeeld een compressiestroom rechtstreeks op de transportstroom bouwen. In dit geval wordt het oorspronkelijke transport Stream vervangen door een transport dat de compressie Stream rond het origineel verpakt.
U kunt meerdere streamupgrades toepassen, die elk de voorgaande verpakken.
Hoe Stream-upgrades werken
Er zijn vier onderdelen voor het streamupgradeproces.
Een upgradestreaminitiator begint het proces: tijdens runtime kan er een aanvraag naar het andere einde van de verbinding worden gestart om de kanaaltransportlaag te upgraden.
Een upgradestream acceptor voert de upgrade uit: tijdens runtime ontvangt deze de upgradeaanvraag van de andere computer en accepteert de upgrade, indien mogelijk, de upgrade.
Een upgradeprovider maakt de initiator op de client en de acceptor op de server.
Er wordt een bindingselement voor een streamupgrade toegevoegd aan de bindingen op de service en de client en wordt de provider gemaakt tijdens runtime.
Houd er rekening mee dat in het geval van meerdere upgrades de Initiator en Acceptor statusmachines inkapselen om af te dwingen welke upgradeovergangen geldig zijn voor elke initiatie.
Een Stream Upgrade implementeren
Windows Communication Foundation (WCF) biedt vier abstract
klassen die u kunt implementeren:
Ga als volgt te werk om een aangepaste streamupgrade te implementeren. Met deze procedure wordt een minimaal streamupgradeproces geïmplementeerd op zowel de client- als servercomputers.
Maak een klasse die wordt geïmplementeerd StreamUpgradeInitiator.
Overschrijf de InitiateUpgrade methode voor het uitvoeren van de stream die moet worden geüpgraded en retourneer de bijgewerkte stream. Deze methode werkt synchroon; er zijn analoge methoden om de upgrade asynchroon te initiëren.
Overschrijf de GetNextUpgrade methode om te controleren op extra upgrades.
Maak een klasse die wordt geïmplementeerd StreamUpgradeAcceptor.
Overschrijf de AcceptUpgrade methode voor het uitvoeren van de stream die moet worden geüpgraded en retourneer de bijgewerkte stream. Deze methode werkt synchroon; er zijn analoge methoden om de upgrade asynchroon te accepteren.
Overschrijf de CanUpgrade methode om te bepalen of de aangevraagde upgrade wordt ondersteund door deze upgrade-acceptor op dit moment in het upgradeproces.
Maak een klasse die door de implementaties wordt geïmplementeerd StreamUpgradeProvider. Overschrijf de CreateUpgradeAcceptor methoden voor CreateUpgradeInitiator het retourneren van exemplaren van de acceptor en initiator die zijn gedefinieerd in stap 2 en 1.
Maak een klasse die wordt geïmplementeerd StreamUpgradeBindingElement.
Overschrijf de BuildClientStreamUpgradeProvider methode op de client en de BuildServerStreamUpgradeProvider methode in de service.
Overschrijf de BuildChannelFactory methode op de client en de BuildChannelListener methode in de service om het upgradebindingselement toe te voegen aan BindingParameters.
Voeg het nieuwe bindingselement voor de stream-upgrade toe aan bindingen op de server- en clientcomputers.
Beveiligingsupgrades
Het toevoegen van een beveiligingsupgrade is een gespecialiseerde versie van het algemene stream-upgradeproces.
WCF biedt al twee bindingselementen voor het upgraden van streambeveiliging. De configuratie van beveiliging op transportniveau wordt ingekapseld door de WindowsStreamSecurityBindingElement en SslStreamSecurityBindingElement die kan worden geconfigureerd en toegevoegd aan een aangepaste binding. Deze bindingselementen breiden de StreamUpgradeBindingElement klasse uit waarmee de client- en serverstreamupgradeproviders worden gebouwd. Deze bindingselementen hebben methoden waarmee de gespecialiseerde providerklassen voor de beveiligingsstroomupgrade worden gemaakt, die niet public
zijn, dus voor deze twee gevallen hoeft u alleen maar het bindingselement toe te voegen aan de binding.
Voor beveiligingsscenario's die niet worden voldaan door de bovenstaande twee bindingselementen, worden drie beveiligingsgerelateerde abstract
klassen afgeleid van de bovenstaande initiator, acceptor en providerbasisklassen:
Het proces voor het implementeren van een upgrade van een beveiligingsstream is hetzelfde als voorheen, met het verschil dat u zou afleiden van deze drie klassen. Overschrijf de aanvullende eigenschappen in deze klassen om beveiligingsinformatie aan de runtime te leveren.
Meerdere upgrades
Als u extra upgradeaanvragen wilt maken, herhaalt u het bovenstaande proces: maak extra extensies van StreamUpgradeProvider en bindingselementen. Voeg de bindingselementen toe aan de binding. De extra bindingselementen worden opeenvolgend verwerkt, te beginnen met het eerste bindingselement dat aan de binding is toegevoegd. In BuildChannelFactory en BuildChannelListener elke upgradeprovider kan bepalen hoe u zichzelf kunt layeren op bestaande parameters voor upgradebinding. Vervolgens moet de bestaande parameter voor de upgradebinding worden vervangen door een nieuwe parameter voor een samengestelde upgradebinding.
Een upgradeprovider kan ook meerdere upgrades ondersteunen. U kunt bijvoorbeeld een aangepaste stream-upgradeprovider implementeren die ondersteuning biedt voor zowel beveiliging als compressie. Voer de volgende stappen uit:
Subklasse StreamSecurityUpgradeProvider voor het schrijven van de providerklasse waarmee de initiator en acceptor worden gemaakt.
De subklasse zorgt StreamSecurityUpgradeInitiator ervoor dat u de GetNextUpgrade methode overschrijft om de inhoudstypen voor de compressiestroom en de beveiligde stream in volgorde te retourneren.
Subklasse waarin StreamSecurityUpgradeAcceptor de aangepaste inhoudstypen in CanUpgrade de methode worden begrepen.
De stream wordt geüpgraded na elke aanroep naar GetNextUpgrade en CanUpgrade.