Delen via


Aangepaste stream-upgrades

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 stream-upgrades toepassen, die elk de voorgaande omhullen.

Hoe Stream-upgrades werken

Er zijn vier onderdelen bij het stream-upgradeproces.

  1. Een upgradestreaminitiator begint het proces: tijdens runtime kan deze een aanvraag naar het andere einde van de verbinding initiëren om de kanaaltransportlaag te upgraden.

  2. Een upgradestream-acceptor voert de upgrade uit: tijdens runtime ontvangt deze de upgradeaanvraag van de andere computer en accepteert indien mogelijk de upgrade.

  3. Een upgradeprovider maakt de initiator op de client en de acceptor op de server.

  4. Er wordt een streamupgrade-bindingselement toegevoegd aan de bindingen op de service en de client, en de provider wordt tijdens runtime gemaakt.

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.

  1. Maak een klasse die StreamUpgradeInitiator implementeert.

    1. 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.

    2. Overschrijf de GetNextUpgrade methode om te controleren op extra upgrades.

  2. Maak een klasse die StreamUpgradeAcceptor implementeert.

    1. 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.

    2. Overschrijf de CanUpgrade methode om te bepalen of de aangevraagde upgrade wordt ondersteund door deze upgrade-acceptor op dit moment in het upgradeproces.

  3. Maak een klasse die StreamUpgradeProvider implementeert. Overschrijf de methoden CreateUpgradeAcceptor en CreateUpgradeInitiator om exemplaren van de acceptor en initiator te retourneren zoals gedefinieerd in stap 2 en 1.

  4. Maak een klasse die StreamUpgradeBindingElement implementeert.

    1. Overschrijf de BuildClientStreamUpgradeProvider methode op de client en de BuildServerStreamUpgradeProvider methode in de service.

    2. Overschrijf de BuildChannelFactory methode bij de client en de BuildChannelListener methode bij de service om het upgrade-bindingselement toe te voegen aan BindingParameters.

  5. 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 publiczijn, 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:

  1. System.ServiceModel.Channels.StreamSecurityUpgradeInitiator

  2. System.ServiceModel.Channels.StreamSecurityUpgradeAcceptor

  3. System.ServiceModel.Channels.StreamSecurityUpgradeProvider

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 kan elke upgradeprovider bepalen hoe deze zich kan overlagen op reeds 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:

  1. Subklasse StreamSecurityUpgradeProvider voor het schrijven van de providerklasse waarmee de initiator en acceptor worden gemaakt.

  2. Maak een subklasse van StreamSecurityUpgradeInitiator en zorg ervoor dat u de GetNextUpgrade methode overschrijft om de inhoudstypen voor de compressiestroom en de beveiligde stream in de juiste volgorde te retourneren.

  3. Maak een subklasse van StreamSecurityUpgradeAcceptor die de aangepaste inhoudstypen in zijn CanUpgrade-methode begrijpt.

  4. De stream wordt geüpgraded na elke aanroep naar GetNextUpgrade en CanUpgrade.

Zie ook