Vlastní zachycování zpráv
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 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 obrazců kanálu bude vaše továrna kanálu a naslouchací proces kanálu podporovat.
Vytvořte objekt pro vytváření kanálů a naslouchací proces kanálu, který podporuje obrazce kanálu.
Přidejte element vazby, který přidá vlastní vrstvený kanál do zásobníku kanálu.
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).
Objekt pro vytváření kanálů a naslouchací proces
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 naslouchací proces a delegují všechny OnCreateChannel
OnAcceptChannel
kromě volání do vnitřní továrny a naslouchacího procesu.
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
//...
}
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
//...
}
Přidání elementu vazby
Ukázka definuje vlastní element vazby: InterceptingBindingElement
. InterceptingBindingElement
ChannelMessageInterceptor
přebírá jako vstup a používá ho ChannelMessageInterceptor
k manipulaci se zprávami, které je procházejí. Toto je jediná třída, která musí být veřejná. Továrna, naslouchací proces a kanály můžou být interní implementace veřejných rozhraní za běhu.
public class InterceptingBindingElement : BindingElement
{
}
Přidání podpory konfigurace
Pro integraci s konfigurací vazby knihovna definuje obslužnou rutinu oddílu konfigurace jako oddíl vazby rozšíření elementu. 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í zásad
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 mohl uživatel podporovat import zásad na vygenerovaném klientovi, může zaregistrovat odvozenou třídu InterceptingBindingElementImporter
a přepsat CreateMessageInterceptor
() a vygenerovat třídu s povolenou ChannelMessageInterceptor
zásadou.
Příklad: Droppable Message Inspector
Součástí ukázky je ukázková implementace, která ChannelMessageInspector
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ý oddíl konfigurace k vložení vlastních továren do nejnižší úrovně zásobníků kanálů za běhu (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.
Nastavení, sestavení a spuštění ukázky
Pomocí následujícího příkazu nainstalujte ASP.NET 4.0.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Pokud chcete sestavit řešení, postupujte podle pokynů v části Sestavení ukázek Windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.
Nejprve spusťte Service.exe a pak spusťte Client.exe a sledujte okna konzoly pro výstup.