Dela via


Custom Stream-uppgraderingar

Strömorienterade transporter som TCP och Namngivna rör körs på en kontinuerlig ström av byte mellan klienten och servern. Den här dataströmmen realiseras av ett Stream objekt. I en strömuppgradering vill klienten lägga till ett valfritt protokollskikt i kanalstacken och ber den andra änden av kommunikationskanalen att göra det. Strömuppgraderingen består i att ersätta det ursprungliga Stream objektet med ett uppgraderat objekt.

Du kan till exempel skapa en komprimeringsström direkt ovanpå transportströmmen. I det här fallet ersätts den ursprungliga transporten Stream med en som omsluter komprimering Stream runt den ursprungliga.

Du kan använda flera strömuppgraderingar, var och en omsluter den föregående.

Så här fungerar Stream Upgrades

Det finns fyra komponenter i uppgraderingsprocessen för dataströmmen.

  1. En uppgraderingsström initierare påbörjar processen: vid körning kan den initiera en begäran till den andra änden av anslutningen för att uppgradera kanaltransportlagret.

  2. En acceptor för uppgraderingsströmmen utför uppgraderingen: vid körning tar den emot uppgraderingsbegäran från den andra datorn och godkänner uppgraderingen om möjligt.

  3. En uppgraderingsprovider skapar initieraren på klienten och acceptorn på servern.

  4. Ett bindningselement för direktuppgradering läggs till i bindningarna för tjänsten och klienten och skapar providern vid körning.

Observera att vid flera uppgraderingar kapslar initieraren och acceptorn in tillståndsdatorer för att framtvinga vilka uppgraderingsövergångar som är giltiga för varje initiering.

Implementera en Stream-uppgradering

Windows Communication Foundation (WCF) innehåller fyra abstract klasser som du kan implementera:

Gör följande för att implementera en anpassad strömuppgradering. Den här proceduren implementerar en minimal strömuppgraderingsprocess på både klient- och serverdatorerna.

  1. Skapa en klass som implementerar StreamUpgradeInitiator.

    1. Åsidosätt metoden InitiateUpgrade för att ta in strömmen som ska uppgraderas och returnera den uppgraderade strömmen. Den här metoden fungerar synkront. det finns analoga metoder för att initiera uppgraderingen asynkront.

    2. Åsidosätt GetNextUpgrade metoden för att söka efter ytterligare uppgraderingar.

  2. Skapa en klass som implementerar StreamUpgradeAcceptor.

    1. Åsidosätt metoden AcceptUpgrade för att ta in strömmen som ska uppgraderas och returnera den uppgraderade strömmen. Den här metoden fungerar synkront. det finns analoga metoder för att acceptera uppgraderingen asynkront.

    2. CanUpgrade Åsidosätt metoden för att avgöra om den begärda uppgraderingen stöds av den här uppgraderings acceptorn vid den här tidpunkten i uppgraderingsprocessen.

  3. Skapa en klass som implementerar StreamUpgradeProvider. Åsidosätt CreateUpgradeAcceptor metoderna och CreateUpgradeInitiator för att returnera instanser av acceptorn och initieraren som definierats i steg 2 och 1.

  4. Skapa en klass som implementerar StreamUpgradeBindingElement.

    1. Åsidosätt BuildClientStreamUpgradeProvider metoden på klienten och BuildServerStreamUpgradeProvider metoden för tjänsten.

    2. Åsidosätt BuildChannelFactory metoden på klienten och BuildChannelListener metoden på tjänsten för att lägga till uppgraderingsbindningselementet i BindingParameters.

  5. Lägg till det nya dataströmuppgraderingsbindningselementet till bindningar på servern och klientdatorerna.

Säkerhetsuppgraderingar

Att lägga till en säkerhetsuppgradering är en specialiserad version av den allmänna strömuppgraderingsprocessen.

WCF innehåller redan två bindningselement för uppgradering av strömsäkerhet. Konfigurationen av säkerhet på transportnivå kapslas in av WindowsStreamSecurityBindingElement och SslStreamSecurityBindingElement som kan konfigureras och läggas till i en anpassad bindning. De här bindningselementen utökar klassen StreamUpgradeBindingElement som skapar uppgraderingsprovidrar för klient- och serverströmmen. Dessa bindningselement har metoder som skapar de specialiserade providerklasserna för uppgradering av säkerhetsströmmar, som inte publicär , så för dessa två fall behöver du bara lägga till bindningselementet i bindningen.

För säkerhetsscenarier som inte uppfylls av ovanstående två bindningselement härleds tre säkerhetsrelaterade abstract klasser från ovanstående start-, acceptor- och providerbasklasser:

  1. System.ServiceModel.Channels.StreamSecurityUpgradeInitiator

  2. System.ServiceModel.Channels.StreamSecurityUpgradeAcceptor

  3. System.ServiceModel.Channels.StreamSecurityUpgradeProvider

Processen för att implementera en uppgradering av säkerhetsströmmen är densamma som tidigare, med den skillnad som du skulle härleda från dessa tre klasser. Åsidosätt de ytterligare egenskaperna i dessa klasser för att tillhandahålla säkerhetsinformation till körningen.

Flera uppgraderingar

Om du vill skapa ytterligare uppgraderingsbegäranden upprepar du ovanstående process: skapa ytterligare tillägg av och bindningselement StreamUpgradeProvider . Lägg till bindningselementen i bindningen. De ytterligare bindningselementen bearbetas sekventiellt, från och med det första bindningselementet som läggs till i bindningen. I BuildChannelFactory och BuildChannelListener varje uppgraderingsprovider kan avgöra hur man lagrar sig själv på befintliga uppgraderingsbindningsparametrar. Den bör sedan ersätta den befintliga uppgraderingsbindningsparametern med en ny bindningsparameter för sammansatt uppgradering.

Alternativt kan en uppgraderingsprovider stödja flera uppgraderingar. Du kanske till exempel vill implementera en anpassad stream-uppgraderingsprovider som stöder både säkerhet och komprimering. Använd följande steg:

  1. Underklass StreamSecurityUpgradeProvider för att skriva providerklassen som skapar initieraren och acceptorn.

  2. Underklassa StreamSecurityUpgradeInitiator att åsidosätta GetNextUpgrade metoden för att returnera innehållstyperna för komprimeringsströmmen och den säkra strömmen i ordning.

  3. Underklass som StreamSecurityUpgradeAcceptor förstår de anpassade innehållstyperna i sin CanUpgrade metod.

  4. Strömmen uppgraderas efter varje anrop till GetNextUpgrade och CanUpgrade.

Se även