Sdílet prostřednictvím


Vlastní vylepšení streamu

Přenosy orientované na datové proudy, jako jsou TCP a pojmenované kanály, pracují s nepřetržitým proudem bajtů mezi klientem a serverem. Tento datový proud je realizován objektem Stream . Při upgradu komunikačního kanálu chce klient přidat do zásobníku kanálu volitelnou vrstvu protokolu a požádá opačnou stranu komunikačního kanálu, aby to udělala. Upgrade datového proudu spočívá v nahrazení původního Stream objektu upgradovaným objektem.

Můžete například vytvořit stream komprese přímo nad přenosovým proudem. V tomto případě je původní přenos Stream nahrazen takovým, který obalí kompresi Stream kolem původního přenosu.

Můžete použít více upgradů datového proudu, přičemž každý z nich obalí předchozí upgrade.

Jak fungují aktualizace streamu

Proces upgradu streamu má čtyři komponenty.

  1. Iniciátor upgradu streamu zahájí proces: za běhu může zahájit požadavek na druhý konec připojení k upgradu přenosové vrstvy kanálu.

  2. Akceptátor streamu upgradu provede upgrade: za běhu obdrží požadavek na upgrade z jiného počítače a pokud je to možné, přijme upgrade.

  3. Poskytovatel upgradu vytváří iniciátor na straně klienta a acceptor na serveru.

  4. Element vazby upgradu datového toku se přidává do vazeb služby a klienta a zprostředkovatel se vytvoří za běhu.

Všimněte si, že v případě několika upgradů zapouzdřují iniciátor a akceptátor stavové počítače, které vynucují, které přechody upgradu jsou platné pro každou iniciaci.

Jak implementovat upgrade streamu

Windows Communication Foundation (WCF) poskytuje čtyři abstract třídy, které můžete implementovat:

Pokud chcete implementovat vlastní upgrade streamu, postupujte následovně. Tento postup implementuje minimální proces upgradu datového proudu na klientských i serverových počítačích.

  1. Vytvořte třídu, která implementuje StreamUpgradeInitiator.

    1. Přepište metodu InitiateUpgrade, aby přijímala stream, který má být upgradován, a vracela upgradovaný stream. Tato metoda funguje synchronně; existují podobné metody, jak inicializovat upgrade asynchronně.

    2. Přepište metodu GetNextUpgrade a zkontrolujte další upgrady.

  2. Vytvořte třídu, která implementuje StreamUpgradeAcceptor.

    1. Přepište metodu AcceptUpgrade, aby přijímala stream, který má být upgradován, a vracela upgradovaný stream. Tato metoda funguje synchronně; existují podobné metody, jak upgrade přijmout asynchronně.

    2. Přepište metodu CanUpgrade , která určuje, jestli je požadovaný upgrade podporován tímto akceptátorem upgradu v tomto okamžiku v procesu upgradu.

  3. Vytvořte třídu, která implementuje StreamUpgradeProvider. Přepište metody CreateUpgradeAcceptor a CreateUpgradeInitiator tak, aby vracely instance akceptátoru a iniciátoru definované v krocích 2 a 1.

  4. Vytvořte třídu, která implementuje StreamUpgradeBindingElement.

    1. Přepište metodu BuildClientStreamUpgradeProvider na klientovi a metodu BuildServerStreamUpgradeProvider ve službě.

    2. Přepište metodu BuildChannelFactory na klientu a metodu BuildChannelListener na službě, abyste přidali prvek upgradu vazby do BindingParameters.

  5. Přidejte nový element vazby upgradu datového proudu do vazeb na serveru a klientských počítačích.

Upgrady zabezpečení

Přidání bezpečnostní aktualizace je specializovaná verze obecného procesu upgradu datového toku.

WCF již poskytuje dva prvky vazby pro upgrade zabezpečení datových proudů. Konfigurace zabezpečení na úrovni přenosu je zapouzdřena pomocí WindowsStreamSecurityBindingElement a SslStreamSecurityBindingElement, které lze nakonfigurovat a přidat do vlastní vazby. Tyto vazební prvky rozšiřují třídu StreamUpgradeBindingElement, která vytváří poskytovatele upgradu toku pro klienta a server. Tyto prvky vazby mají metody, které vytvářejí specializované třídy poskytovatele vylepšení bezpečnostního proudového proudu, které nejsou public, takže pro tyto dva případy stačí pouze přidat prvek vazby do vazby.

Pro scénáře zabezpečení, které nejsou splněny výše dvěma prvky vazby, jsou tři třídy související se abstract zabezpečením odvozeny od výše uvedeného iniciátoru, akceptátoru a základní třídy zprostředkovatele:

  1. System.ServiceModel.Channels.StreamSecurityUpgradeInitiator

  2. System.ServiceModel.Channels.StreamSecurityUpgradeAcceptor

  3. System.ServiceModel.Channels.StreamSecurityUpgradeProvider

Proces implementace upgradu datového proudu zabezpečení je stejný jako předtím, s rozdílem, který byste odvozovali z těchto tří tříd. Přepište další vlastnosti v těchto třídách a zadejte informace o zabezpečení modulu runtime.

Více upgradů

Pokud chcete vytvořit další žádosti o upgrade, zopakujte výše uvedený proces: vytvořte další rozšíření StreamUpgradeProvider a prvky vazby. Přidejte vazebné prvky do vazby. Další prvky vazby se zpracovávají postupně, počínaje prvním prvkem vazby přidaným do vazby. V BuildChannelFactory a BuildChannelListener může každý poskytovatel upgradu určit, jak se vrstvit na jakýchkoli už existujících parametrech vazby upgradu. Potom by měl nahradit existující parametr vazby upgradu novým parametrem vazby složeného upgradu.

Alternativně může jeden poskytovatel upgradu podporovat více upgradů. Můžete například chtít implementovat vlastního poskytovatele upgradu streamu, který podporuje zabezpečení i kompresi. Proveďte následující kroky:

  1. Podtřída StreamSecurityUpgradeProvider pro zápis třídy zprostředkovatele, která vytvoří iniciátor a acceptor.

  2. Podtřídu StreamSecurityUpgradeInitiator implementujte a nezapomeňte přepsat metodu GetNextUpgrade tak, aby vracela typy obsahu pro kompresní proud a zabezpečený datový proud ve správném pořadí.

  3. Podtřída StreamSecurityUpgradeAcceptor , která rozumí vlastním typům obsahu ve své CanUpgrade metodě.

  4. Stream se upgraduje po každém volání GetNextUpgrade a CanUpgrade.

Viz také