Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A MessageInterceptor-minta a csatorna bővíthetőségi modelljének használatát mutatja be. Különösen azt mutatja be, hogyan lehet implementálni egy egyéni kötési elemet, amely csatornagyárt és csatornafigyelőt hoz létre azzal a céllal, hogy a futtatókörnyezeti verem meghatározott pontján elfogja az összes bejövő és kimenő üzenetet. A minta egy klienset és szervert is tartalmaz, amely bemutatja ezeknek az egyéni gyáraknak a használatát.
Ebben a mintában az ügyfél és a szolgáltatás egyaránt konzolprogramok (.exe). Az ügyfél és a szolgáltatás egyaránt használ egy közös kódtárat (.dll), amely az egyéni kötési elemet és a hozzá tartozó futtatókörnyezeti objektumokat tartalmazza.
Megjegyzés:
A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.
A minta a Windows Communication Foundation (WCF) egyéni rétegzett csatornáinak létrehozásának ajánlott eljárását ismerteti a csatorna keretrendszerének használatával és a WCF ajánlott eljárásainak követésével. Az egyéni rétegzett csatorna létrehozásának lépései a következők:
Döntse el, hogy a csatorna-előállító és a csatornafigyelő mely csatornaformákat támogatja.
Hozzon létre egy csatorna-előállítót és egy csatornafigyelőt, amely támogatja a csatornaalakzatokat.
Adjon hozzá egy kötési elemet, amely hozzáadja az egyéni rétegzett csatornát egy csatornaveremhez.
Adjon hozzá egy kötéselem-bővítményszakaszt, amely elérhetővé teszi az új kötési elemet a konfigurációs rendszer számára.
Csatornaalakzatok
Az egyéni rétegzett csatorna írásának első lépése annak eldöntése, hogy mely alakzatok szükségesek a csatornához. Az üzenetfelügyelőnk minden olyan alakzatot támogat, amelyet az alattunk lévő réteg támogat (például, ha az alattunk lévő réteg fel tud építeni IOutputChannel és IDuplexSessionChannel, akkor mi is elérhetővé tesszük IOutputChannel és IDuplexSessionChannel).
Channel Factory és Listener Factory
Az egyéni rétegzett csatornák írásának következő lépése az, hogy létrehozzuk a IChannelFactory implementációját ügyfélcsatornákhoz és a IChannelListener implementációját szolgáltatáscsatornákhoz.
Ezek az osztályok elfogadnak egy belső gyárat és figyelőt, és az összes hívást, kivéve a OnCreateChannel és OnAcceptChannel hívásokat, delegálják a belső gyárra és figyelőre.
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
//...
}
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
//...
}
Kötéselem hozzáadása
A minta egy egyéni kötési elemet határoz meg: InterceptingBindingElement.
InterceptingBindingElement a ChannelMessageInterceptor-t bemenetként veszi, és ezt a ChannelMessageInterceptor-t használja a rajta áthaladó üzenetek manipulálására. Ez az egyetlen olyan osztály, amelyet nyilvánosnak kell lennie. A gyár, a figyelő és a csatornák mind lehetnek a nyilvános futtatókörnyezeti felületek belső implementációi.
public class InterceptingBindingElement : BindingElement
{
}
Konfigurációs támogatás hozzáadása
A kötéskonfigurációval való integrációhoz a kódtár egy konfigurációs szakaszkezelőt határoz meg kötéselem-bővítményszakaszként. Az ügyfél- és kiszolgálókonfigurációs fájloknak regisztrálniuk kell a kötéselem-bővítményt a konfigurációs rendszeren. Ebből az osztályból származhatnak azok a implementátorok, amelyek el szeretnék helyezni a kötési elemet a konfigurációs rendszer számára.
public abstract class InterceptingElement : BindingElementExtensionElement
{
//...
}
Szabályzat hozzáadása
A szabályzatrendszerrel való integrációhoz implementálja az IPolicyExportExtensiont, InterceptingBindingElement hogy jelezzük, részt kell vennünk a szabályzat létrehozásában. A generált ügyfélre vonatkozó szabályzat importálásának támogatása érdekében a felhasználó regisztrálhat egy InterceptingBindingElementImporter származtatott osztályt, és felülbírálhatja a CreateMessageInterceptor() függvényt, hogy létrehozza a szabályzatokat kezelő ChannelMessageInterceptor osztályukat.
Példa: Eldobható Üzenetellenőr
A mintában szerepel egy példamegvalósítás a ChannelMessageInspector-nak, amely elveti az üzeneteket.
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
A konfigurációból az alábbiak szerint érheti el:
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
Az ügyfél és a kiszolgáló is ezt az újonnan létrehozott konfigurációs szakaszt használja az egyéni gyáraknak a futtatókörnyezeti csatornaveremek legalacsonyabb szintjére való beszúrásához (az átviteli szint felett).
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
Az ügyfél a MessageInterceptor tár használatával egyéni fejlécet ad hozzá a számozott üzenetekhez. Ezzel szemben a szolgáltatás MessageInterceptor könyvtár használatával elveti azokat az üzeneteket, amelyek nem rendelkeznek ezzel a speciális fejléccel.
A szolgáltatás, majd az ügyfél futtatása után a következő ügyfélkimenetnek kell megjelennie.
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
Az ügyfél 10 különböző szélsebességről számol be a szolgáltatásnak, de csak a felét címkézi meg a speciális fejléccel.
A szolgáltatásban a következő kimenetnek kell megjelennie:
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.
A példa beállítása, elkészítése és futtatása
Telepítse a ASP.NET 4.0-t az alábbi paranccsal.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enableGyőződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.
A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.
Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse A Windows Communication Foundation-minták futtatásacímű témakör utasításait.
Először futtassa Service.exe, majd futtassa a Client.exe, és figyelje mindkét konzolablak kimenetét.