Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ukázka MessageInterceptor ukazuje použití modelu rozšiřitelnosti kanálu. Konkrétně ukazuje, jak implementovat vlastní element vazby, který vytváří objekty pro vytváření kanálů a naslouchací procesy pro zachycení všech příchozích a odchozích zpráv v určitém bodě v zásobníku modulu runtime. Ukázka obsahuje také klienta a server, který demonstruje použití těchto vlastních továren.
V této ukázce jsou klient i služba konzolové programy (.exe). Klient i služba využívají společnou knihovnu (.dll), která obsahuje vlastní element vazby a přidružené objekty runtime.
Poznámka:
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
Ukázka popisuje doporučený postup vytvoření vlastního vrstveného kanálu ve Windows Communication Foundation (WCF) pomocí rozhraní kanálu a následujících osvědčených postupů WCF. Postup vytvoření vlastního vrstveného kanálu je následující:
Rozhodněte se, které z tvarů kanálu bude vaše továrna kanálu a posluchač kanálu podporovat.
Vytvořte továrnu na kanály a naslouchací komponentu kanálu, které podporují vaše typy kanálů.
Přidejte vazební prvek, který připojí vlastní vrstvený kanál do zásobníku kanálů.
Přidejte oddíl rozšíření elementu vazby, který zpřístupní nový element vazby do konfiguračního systému.
Obrazce kanálu
Prvním krokem při psaní vlastního vrstveného kanálu je rozhodnout, které obrazce jsou pro kanál potřeba. U našeho inspektoru zpráv podporujeme jakýkoli obrazec, který vrstva pod námi podporuje (například pokud vrstva pod námi může sestavit IOutputChannel a IDuplexSessionChannelpak také zveřejníme IOutputChannel a IDuplexSessionChannel).
Továrna kanálů a továrna naslouchání
Dalším krokem při psaní vlastního vrstveného kanálu je vytvoření implementace IChannelFactory pro klientské kanály a IChannelListener kanály služeb.
Tyto třídy přebírají vnitřní továrnu a posluchače a delegují všechna volání kromě OnCreateChannel a OnAcceptChannel na vnitřní továrnu a posluchače.
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
//...
}
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
//...
}
Přidání elementu vazby
Ukázka definuje vlastní element vazby: InterceptingBindingElement.
InterceptingBindingElement bere ChannelMessageInterceptor jako vstup a používá toto ChannelMessageInterceptor k manipulaci se zprávami, které skrz něj procházejí. Toto je jediná třída, která musí být veřejná. Továrna, posluchač a kanály mohou být interní implementace veřejných rozhraní runtime.
public class InterceptingBindingElement : BindingElement
{
}
Přidání podpory konfigurace
Pro integraci s konfigurací propojení knihovna definuje obslužnou rutinu sekce konfigurace jako sekci rozšíření prvku vazby. Konfigurační soubory klienta a serveru musí zaregistrovat rozšíření elementu vazby v konfiguračním systému. Implementátory, kteří chtějí vystavit svůj element vazby konfiguračnímu systému, mohou odvodit z této třídy.
public abstract class InterceptingElement : BindingElementExtensionElement
{
//...
}
Přidání politiky
Pokud se chceme integrovat s naším systémem zásad, InterceptingBindingElement implementuje IPolicyExportExtension, abychom signalizovali, že bychom se měli účastnit generování zásad. Aby uživatel mohl podporovat import zásad na vygenerovaném klientovi, může zaregistrovat odvozenou třídu InterceptingBindingElementImporter, přepsat CreateMessageInterceptor() a vygenerovat třídu, kde je povolena zásada ChannelMessageInterceptor.
Příklad: Droppable Message Inspector
Součástí ukázky je příklad implementace ChannelMessageInspector, která zahodí zprávy.
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
Přístup k němu můžete získat z konfigurace následujícím způsobem:
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
Klient i server používají tento nově vytvořený konfigurační oddíl k vložení vlastních továren do nejnižší úrovně zásobníků kanálů modulu runtime (nad úrovní přenosu).
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
Klient používá knihovnu MessageInterceptor k přidání vlastní hlavičky do sudých číslovaných zpráv. Služba na druhé straně používá MessageInterceptor knihovnu k vyřazení všech zpráv, které nemají tuto speciální hlavičku.
Po spuštění služby a potom klienta by se měl zobrazit následující výstup klienta.
Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client
Klient hlásí do služby 10 různých rychlostí větru, ale pouze polovinu z nich označí speciální hlavičkou.
Ve službě by se měl zobrazit následující výstup:
Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.
Jak nastavit, sestavit a spustit ukázku
Pomocí následujícího příkazu nainstalujte ASP.NET 4.0.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enableUjistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.
Pro sestavení řešení postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.
Nejprve spusťte Service.exe a poté spusťte Client.exe a sledujte obě okna konzoly pro výstup.