Szállítás: UDP
Az UDP transport minta bemutatja, hogyan implementálható az UDP egycímes és csoportos küldés egyéni Windows Communication Foundation (WCF) átvitelként. A minta az egyéni átvitel WCF-ben való létrehozásának ajánlott eljárását ismerteti a csatorna-keretrendszer használatával és a WCF ajánlott eljárásainak követésével. Az egyéni átvitel létrehozásának lépései a következők:
Döntse el, hogy a channel Message Exchange-minták (IOutputChannel, IInputChannel, IDuplexChannel, IRequestChannel vagy IReplyChannel) közül melyiket támogatja a ChannelFactory és a ChannelListener. Ezután döntse el, hogy támogatja-e ezeknek a felületeknek a munkamenet-változatait.
Hozzon létre egy csatorna-előállítót és -figyelőt, amely támogatja az üzenetcsere-mintát.
Győződjön meg arról, hogy a hálózatspecifikus kivételek a megfelelő származtatott osztályra CommunicationExceptionvannak normalizálva.
Adjon hozzá egy <kötési> elemet, amely hozzáadja az egyéni átvitelt egy csatornaveremhez. További információ: Kötéselem hozzáadása.
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.
Metaadat-bővítmények hozzáadása a képességek más végpontokkal való kommunikációához.
Adjon hozzá egy kötést, amely előre konfigurálja a kötéselemeket egy jól definiált profil szerint. További információ: Standard kötés hozzáadása.
Adjon hozzá egy kötésszakaszt és egy kötéskonfigurációs elemet, hogy a kötést elérhetővé tegye a konfigurációs rendszer számára. További információ: Konfigurációs támogatás hozzáadása.
Üzenetváltási minták
Az egyéni átvitel írásának első lépése annak eldöntése, hogy mely üzenetcsere-mintákra (EP-k) van szükség az átvitelhez. Három európai parlamenti képviselő közül választhat:
Datagram (IInputChannel/IOutputChannel)
Datagram-képviselő használata esetén az ügyfél "tűz és felejtés" cserével küld üzenetet. A tűz és a felejtés cseréje olyan, amely sávon kívüli megerősítést igényel a sikeres kézbesítésről. Előfordulhat, hogy az üzenet elveszik az átvitel során, és soha nem éri el a szolgáltatást. Ha a küldési művelet sikeresen befejeződik az ügyfél végén, nem garantálja, hogy a távoli végpont megkapta az üzenetet. A datagram alapvető építőeleme az üzenetkezelésnek, mivel saját protokollokat hozhat létre rajta – beleértve a megbízható protokollokat és a biztonságos protokollokat is. Az ügyfél datagram csatornái implementálják az interfészt, és a IOutputChannel service datagram csatornák implementálják az interfészt IInputChannel .
Request-Response (IRequestChannel/IReplyChannel)
Ebben a képviselőben üzenet jelenik meg, és válasz érkezik. A minta kérelem-válasz párokból áll. A kérés-válasz hívások például a távoli eljáráshívások (RPC) és a böngésző GET-jei. Ezt a mintát féloldalasnak is nevezik. Ebben az európai parlamenti képviselőben az ügyfélcsatornák implementálják és implementálják IRequestChannelIReplyChannela szolgáltatási csatornákat.
Kétoldalas (IDuplexChannel)
A kétoldalas képviselő lehetővé teszi, hogy tetszőleges számú üzenetet küldjenek egy ügyfélnek, és bármilyen sorrendben fogadják őket. A kétoldalas képviselő olyan, mint egy telefonbeszélgetés, ahol minden szó egy üzenet. Mivel mindkét oldal küldhet és fogadhat ebben a képviselőben, az ügyfél- és szolgáltatáscsatornák által implementált felület a IDuplexChannel.
Ezek a képviselők támogathatják az üléseket is. A munkamenet-tudatos csatorna által biztosított hozzáadott funkció az, hogy korrelálja a csatornán küldött és fogadott összes üzenetet. A kérés-válasz minta egy különálló kétüzenetes munkamenet, mivel a kérés és a válasz korrelál. Ezzel szemben a munkameneteket támogató kérés-válasz minta azt jelenti, hogy az adott csatornán lévő összes kérés-válasz pár egymással van összefüggésben. Ez összesen hat európai parlamenti képviselőt (Datagram, Request-Response, Duplex, Datagram with sessions, Request-Response with sessions, Request-Response with sessions, Duplex with sessions) biztosít, hogy választani tudjanak.
Feljegyzés
Az UDP-átvitel esetében az egyetlen támogatott európai parlamenti képviselő a Datagram, mivel az UDP eredendően "fire and forget" protokoll.
Az ICommunicationObject és a WCF objektum életciklusa
A WCF rendelkezik egy közös állapotú géppel, amely az olyan objektumok életciklusának kezelésére szolgál, mint a IChannel, IChannelFactoryés IChannelListener amelyek a kommunikációhoz használatosak. Ezek a kommunikációs objektumok öt állapotban létezhetnek. Ezeket az állapotokat az CommunicationState enumerálás jelöli, és a következők:
Létrehozva: Ez a példány első példányának ICommunicationObject állapota. Ebben az állapotban nem történik bemenet/kimenet (I/O).
Megnyitás: Az objektumok erre az állapotra váltanak, amikor Open meghívják. Ezen a ponton a tulajdonságok nem módosíthatók, és kezdődhet a bemenet/kimenet. Ez az áttűnés csak a Létrehozott állapotból érvényes.
Megnyitás: Az objektumok erre az állapotra váltanak a megnyitási folyamat befejezésekor. Ez az áttűnés csak a Megnyitás állapotból érvényes. Ezen a ponton az objektum teljes mértékben használható az átvitelhez.
Zárás: Az objektumok erre az állapotra váltanak, amikor Close kecses leállításra van szükség. Ez az áttűnés csak a Megnyitott állapotból érvényes.
Zárva: A zárt állapotban az objektumok már nem használhatók. Általánosságban elmondható, hogy a legtöbb konfiguráció továbbra is elérhető az ellenőrzéshez, de kommunikáció nem lehetséges. Ez az állapot egyenértékű az elidegenítési állapotmal.
Hibás: Hibás állapotban az objektumok hozzáférhetők az ellenőrzéshez, de már nem használhatók. Nem helyreállítható hiba esetén az objektum ebbe az állapotba kerül. Az egyetlen érvényes áttűnés ebből az állapotból az
Closed
állapotba.
Vannak olyan események, amelyek minden állapotváltásnál aktiválódnak. A Abort metódus bármikor meghívható, és az objektum azonnal átvált az aktuális állapotáról a Zárt állapotba. A hívás Abort megszakítja a befejezetlen munkát.
Channel Factory és Channel Listener
Az egyéni átvitel írásának következő lépése IChannelFactory az ügyfélcsatornák és a szolgáltatáscsatornák implementációjának IChannelListener létrehozása. A csatornaréteg gyári mintát használ a csatornák létrehozásához. A WCF alaposztály-segítőket biztosít ehhez a folyamathoz.
Az CommunicationObject osztály implementálja ICommunicationObject és kikényszeríti a 2. lépésben korábban ismertetett állapotgépet.
Az ChannelManagerBase osztály egységes alaposztályt implementál CommunicationObject és biztosít az és ChannelListenerBasea ChannelFactoryBase . Az ChannelManagerBase osztály a következővel ChannelBaseműködik együtt: egy alaposztály, amely implementálja IChannela elemet .
Az ChannelFactoryBase osztály a túlterheléseket ChannelManagerBase egyetlen
OnCreateChannel
absztrakt metódusba implementálja és IChannelFactory összesítiCreateChannel
.Az ChannelListenerBase osztály implementálja .IChannelListener Gondoskodik az alapvető állapotkezelésről.
Ebben a mintában a gyári implementáció UdpChannelFactory.cs található, a figyelő implementációja pedig a UdpChannelListener.cs. A IChannel megvalósítások UdpOutputChannel.cs és UdpInputChannel.cs.
Az UDP Channel Factory
A UdpChannelFactory
származtatás a következőből származik ChannelFactoryBase: . A minta felülírja GetProperty az üzenetkódoló üzenetverziójának elérését. A minta felülbírálja is, hogy lebonthassuk OnClose a példányt BufferManager , amikor az állapotgép áttűn.
Az UDP kimeneti csatornája
A UdpOutputChannel
implementálások IOutputChannel. A konstruktor ellenőrzi az argumentumokat, és egy célobjektumot EndPoint hoz létre az EndpointAddress átadott érték alapján.
this.socket = new Socket(this.remoteEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
A csatorna kecsesen vagy gyalázatlanul is bezárható. Ha a csatorna kecsesen van lezárva, a szoftvercsatorna bezárul, és a rendszer hívást indít az alaposztály-metódusra OnClose
. Ha ez kivételt eredményez, az infrastruktúra felhívja Abort
a csatorna megtisztítására.
this.socket.Close(0);
Ezután implementáljuk és BeginSend()
/EndSend()
.Send()
Ez két fő szakaszra oszlik. Először szerializáljuk az üzenetet egy bájttömbbe.
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Ezután elküldjük az eredményül kapott adatokat a vezetékre.
this.socket.SendTo(messageBuffer.Array, messageBuffer.Offset, messageBuffer.Count, SocketFlags.None, this.remoteEndPoint);
Az UdpChannelListener
A UdpChannelListener
minta implementálási értéke az ChannelListenerBase osztályból származik. Egyetlen UDP-szoftvercsatornát használ a datagramok fogadásához. A OnOpen
metódus az UDP-szoftvercsatornával fogad adatokat egy aszinkron hurokban. Az adatok ezután üzenetté alakulnak az Üzenetkódolási keretrendszer használatával.
message = MessageEncoderFactory.Encoder.ReadMessage(new ArraySegment<byte>(buffer, 0, count), bufferManager);
Mivel ugyanaz a datagram-csatorna több forrásból érkező üzeneteket jelöl, az UdpChannelListener
egyetlen figyelő. A figyelőhöz legfeljebb egy aktív IChannel társítva van egyszerre. A minta csak akkor hoz létre egy másikat, ha a metódus által AcceptChannel
visszaadott csatornát később megsemmisítik. Amikor egy üzenet érkezik, a rendszer beolvasja ebbe az önálló csatornába.
UdpInputChannel
Az UdpInputChannel
osztály implementálja .IInputChannel
Ez a bejövő üzenetek üzenetsorából áll, amelyet a UdpChannelListener
szoftvercsatorna tölt fel. Ezeket az üzeneteket a metódus lekérdezi IInputChannel.Receive
.
Kötéselem hozzáadása
Most, hogy a gyárak és csatornák elkészültek, egy kötéssel el kell fednünk őket a ServiceModel-futtatókörnyezetben. A kötések olyan kötéselemek gyűjteményei, amelyek egy szolgáltatáscímhez társított kommunikációs vermet jelölnek. A verem minden elemét egy <kötéselem> jelöli.
A mintában a kötési elem a UdpTransportBindingElement
következőből származik TransportBindingElement: . Felülbírálja a következő módszereket a kötésünkhöz társított gyárak létrehozásához.
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
Emellett a rendszer klónozására BindingElement
és visszatérésére szolgáló tagokat is tartalmaz (soap.udp).
Metaadatok támogatása átvitelkötési elemhez
Ahhoz, hogy az átvitelt integrálhassuk a metaadat-rendszerbe, támogatnunk kell a szabályzat importálását és exportálását is. Ez lehetővé teszi, hogy a ServiceModel Metadata Segédprogram eszközzel (Svcutil.exe) hozzunk létre ügyfeleket a kötésünkből.
WSDL-támogatás hozzáadása
A kötések átviteli kötési eleme felelős a metaadatok címzési adatainak exportálásáért és importálásáért. SOAP-kötés használatakor az átviteli kötési elemnek megfelelő átviteli URI-t is exportálnia kell a metaadatokban.
WSDL-exportálás
A címzési adatok exportálásához a UdpTransportBindingElement
kezelőfelület implementálva IWsdlExportExtension
lesz. A ExportEndpoint
metódus hozzáadja a megfelelő címzési adatokat a WSDL-porthoz.
if (context.WsdlPort != null)
{
AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);
}
A UdpTransportBindingElement
metódus implementálása ExportEndpoint
átviteli URI-t is exportál, ha a végpont SOAP-kötést használ.
WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);
if (soapBinding != null)
{
soapBinding.Transport = UdpPolicyStrings.UdpNamespace;
}
WSDL importálása
A WSDL-importálási rendszer kiterjesztése a címek importálásának kezelésére, a következő konfigurációt kell hozzáadnunk a Svcutil.exe konfigurációs fájlhoz a Svcutil.exe.config fájlban látható módon.
<configuration>
<system.serviceModel>
<client>
<metadata>
<policyImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</policyImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
A Svcutil.exe futtatásakor két lehetőség áll rendelkezésre a WSDL-importálási bővítmények betöltésére Svcutil.exe:
Mutasson Svcutil.exe a konfigurációs fájlra a /SvcutilConfig:<fájl> használatával.
Adja hozzá a konfigurációs szakaszt Svcutil.exe.config fájlhoz ugyanabban a könyvtárban, mint Svcutil.exe.
A UdpBindingElementImporter
típus implementálja az interfészt IWsdlImportExtension
. A ImportEndpoint
metódus importálja a címet a WSDL-portról.
BindingElementCollection bindingElements = context.Endpoint.Binding.CreateBindingElements();
TransportBindingElement transportBindingElement = bindingElements.Find<TransportBindingElement>();
if (transportBindingElement is UdpTransportBindingElement)
{
ImportAddress(context);
}
Szabályzattámogatás hozzáadása
Az egyéni kötéselem exportálhatja a szolgáltatásvégpont WSDL-kötésében lévő szabályzatmegerősítéseket, hogy kifejezze a kötéselem képességeit.
Házirend exportálása
A UdpTransportBindingElement
típus implementálva támogatja IPolicyExportExtension
az exportálási szabályzatot. Ennek eredményeképpen a szabályzat létrehozása során minden olyan kötést tartalmaz, System.ServiceModel.MetadataExporter
UdpTransportBindingElement
amely tartalmazza azt.
Ebben IPolicyExportExtension.ExportPolicy
az esetben az UDP-hez egy helyességi feltételt és egy másik állítást adunk hozzá, ha csoportos küldési módban vagyunk. Ennek az az oka, hogy a csoportos küldési mód hatással van a kommunikációs verem felépítésére, ezért mindkét fél között koordinálni kell.
ICollection<XmlElement> bindingAssertions = context.GetBindingAssertions();
XmlDocument xmlDocument = new XmlDocument();
bindingAssertions.Add(xmlDocument.CreateElement(
UdpPolicyStrings.Prefix, UdpPolicyStrings.TransportAssertion, UdpPolicyStrings.UdpNamespace));
if (Multicast)
{
bindingAssertions.Add(xmlDocument.CreateElement(
UdpPolicyStrings.Prefix,
UdpPolicyStrings.MulticastAssertion,
UdpPolicyStrings.UdpNamespace));
}
Mivel az egyéni átviteli kötési elemek felelősek a címzés kezeléséért, a IPolicyExportExtension
UdpTransportBindingElement
végrehajtásnak a megfelelő WS-címzési házirend-állítások exportálásával is foglalkoznia kell, hogy jelezze a használt WS-címzés verzióját.
AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);
Házirend importálása
A szabályzatimportálási rendszer kiterjesztéséhez a következő konfigurációt kell hozzáadnunk a Svcutil.exe konfigurációs fájlhoz a Svcutil.exe.config fájlban látható módon.
<configuration>
<system.serviceModel>
<client>
<metadata>
<policyImporters>
<extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
</policyImporters>
</metadata>
</client>
</system.serviceModel>
</configuration>
Ezután megvalósítjuk IPolicyImporterExtension
a regisztrált osztály (UdpBindingElementImporter
). Ebben ImportPolicy()
az esetben áttekintjük a névtérben lévő állításokat, és feldolgozzuk azokat, amelyek az átvitel generálására szolgálnak, és ellenőrizzük, hogy csoportos küldésről van-e szó. A kötési állítások listájából is el kell távolítanunk a kezelt állításokat. A Svcutil.exe futtatásakor az integrációnak két lehetősége van:
Mutasson Svcutil.exe a konfigurációs fájlra a /SvcutilConfig:<fájl> használatával.
Adja hozzá a konfigurációs szakaszt Svcutil.exe.config fájlhoz ugyanabban a könyvtárban, mint Svcutil.exe.
Standard kötés hozzáadása
Kötési elemünk a következő két módon használható:
Egyéni kötéssel: Az egyéni kötések lehetővé teszik, hogy a felhasználó saját kötést hozzon létre tetszőleges kötési elemek alapján.
Egy rendszer által biztosított kötés használatával, amely tartalmazza a kötési elemet. A WCF számos ilyen rendszer által definiált kötést biztosít, például
BasicHttpBinding
: ,NetTcpBinding
ésWsHttpBinding
. Mindegyik kötés egy jól definiált profilhoz van társítva.
A minta a profilkötést SampleProfileUdpBinding
valósítja meg, amely a következőből Bindingszármazik: . A SampleProfileUdpBinding
fájl legfeljebb négy kötési elemet tartalmaz: UdpTransportBindingElement
, TextMessageEncodingBindingElement CompositeDuplexBindingElement
és ReliableSessionBindingElement
.
public override BindingElementCollection CreateBindingElements()
{
BindingElementCollection bindingElements = new BindingElementCollection();
if (ReliableSessionEnabled)
{
bindingElements.Add(session);
bindingElements.Add(compositeDuplex);
}
bindingElements.Add(encoding);
bindingElements.Add(transport);
return bindingElements.Clone();
}
Egyéni standard kötésimportőr hozzáadása
Svcutil.exe és a WsdlImporter
típus alapértelmezés szerint felismeri és importálja a rendszer által definiált kötéseket. Ellenkező esetben a kötés példányként CustomBinding
lesz importálva. A Svcutil.exe és az WsdlImporter
importálás engedélyezéséhez az SampleProfileUdpBinding
UdpBindingElementImporter
is egyéni szabványos kötésű importőrként működik.
Egy egyéni szabványos kötésimportáló implementálja a metódust az ImportEndpoint
interfészen, IWsdlImportExtension
hogy megvizsgálja a CustomBinding
metaadatokból importált példányt, hogy megállapítsa, létre lehetett-e hozni egy adott standard kötéssel.
if (context.Endpoint.Binding is CustomBinding)
{
Binding binding;
if (transportBindingElement is UdpTransportBindingElement)
{
//if TryCreate is true, the CustomBinding will be replace by a SampleProfileUdpBinding in the
//generated config file for better typed generation.
if (SampleProfileUdpBinding.TryCreate(bindingElements, out binding))
{
binding.Name = context.Endpoint.Binding.Name;
binding.Namespace = context.Endpoint.Binding.Namespace;
context.Endpoint.Binding = binding;
}
}
}
Az egyéni szabványos kötésimportálók implementálásához általában ellenőrizni kell az importált kötéselemek tulajdonságait, és ellenőrizni kell, hogy csak a standard kötés által beállítható tulajdonságok változtak-e, és az összes többi tulajdonság az alapértelmezett érték. A standard kötésimportáló implementálásának alapvető stratégiája a standard kötés egy példányának létrehozása, a kötéselemek tulajdonságainak propagálása a standard kötés által támogatott standard kötéspéldányra, valamint a standard kötés kötési elemeinek összehasonlítása az importált kötési elemekkel.
Konfigurációs támogatás hozzáadása
Ahhoz, hogy a konfiguráción keresztül elérhetővé tegyük az átvitelt, két konfigurációs szakaszt kell implementálnunk. Az első a BindingElementExtensionElement
.UdpTransportBindingElement
Így az CustomBinding
implementációk hivatkozhatnak a kötési elemünkre. A második a Configuration
mi .SampleProfileUdpBinding
Kötéselem bővítményeleme
Ez a szakasz UdpTransportElement
a BindingElementExtensionElement
konfigurációs UdpTransportBindingElement
rendszer számára elérhetővé teszi. Néhány alapvető felülbírálással meghatározzuk a konfigurációs szakasz nevét, a kötési elem típusát és a kötési elem létrehozását. Ezután regisztrálhatjuk a bővítményszakaszt egy konfigurációs fájlban az alábbi kódban látható módon.
<configuration>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
A bővítmény az egyéni kötésekből hivatkozhat az UDP átvitelre való használatára.
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding configurationName="UdpCustomBinding">
<udpTransport/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
Kötési szakasz
Ez a szakasz SampleProfileUdpBindingCollectionElement
a StandardBindingCollectionElement
konfigurációs SampleProfileUdpBinding
rendszer számára elérhetővé teszi. Az implementáció nagy része delegálva van a SampleProfileUdpBindingConfigurationElement
, amely a következőből StandardBindingElement
származik: . Azok SampleProfileUdpBindingConfigurationElement
a tulajdonságok, amelyek megfelelnek a kötés tulajdonságainak SampleProfileUdpBinding
, és a kötésből ConfigurationElement
leképezendő függvények. Végül felülbírálja a metódust a OnApplyConfiguration
következő SampleProfileUdpBinding
mintakódban látható módon.
protected override void OnApplyConfiguration(string configurationName)
{
if (binding == null)
throw new ArgumentNullException("binding");
if (binding.GetType() != typeof(SampleProfileUdpBinding))
{
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
"Invalid type for binding. Expected type: {0}. Type passed in: {1}.",
typeof(SampleProfileUdpBinding).AssemblyQualifiedName,
binding.GetType().AssemblyQualifiedName));
}
SampleProfileUdpBinding udpBinding = (SampleProfileUdpBinding)binding;
udpBinding.OrderedSession = this.OrderedSession;
udpBinding.ReliableSessionEnabled = this.ReliableSessionEnabled;
udpBinding.SessionInactivityTimeout = this.SessionInactivityTimeout;
if (this.ClientBaseAddress != null)
udpBinding.ClientBaseAddress = ClientBaseAddress;
}
Ha regisztrálni szeretné ezt a kezelőt a konfigurációs rendszerben, a következő szakaszt hozzáadjuk a megfelelő konfigurációs fájlhoz.
<configuration>
<configSections>
<sectionGroup name="system.serviceModel">
<sectionGroup name="bindings">
<section name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</sectionGroup>
</sectionGroup>
</configSections>
</configuration>
Ezután a serviceModel konfigurációs szakaszából hivatkozhat rá.
<configuration>
<system.serviceModel>
<client>
<endpoint configurationName="calculator"
address="soap.udp://localhost:8001/"
bindingConfiguration="CalculatorServer"
binding="sampleProfileUdpBinding"
contract= "Microsoft.ServiceModel.Samples.ICalculatorContract">
</endpoint>
</client>
</system.serviceModel>
</configuration>
Az UDP tesztszolgáltatás és ügyfél
A mintaátvitel használatára vonatkozó tesztkód az UdpTestService és az UdpTestClient könyvtárakban érhető el. A szolgáltatáskód két tesztből áll – az egyik teszt a kódból állítja be a kötéseket és a végpontokat, a másik pedig konfiguráción keresztül. Mindkét teszt két végpontot használ. Az egyik végpont a SampleUdpProfileBinding
<reliableSession> halmazt true
használja. A másik végpont egyéni kötést használ a következővel UdpTransportBindingElement
: . Ez egyenértékű a SampleUdpProfileBinding
<reliableSession> beállítással.false
Mindkét teszt létrehoz egy szolgáltatást, minden kötéshez hozzáad egy végpontot, megnyitja a szolgáltatást, majd megvárja, amíg a felhasználó eléri az ENTER billentyűt a szolgáltatás bezárása előtt.
A szolgáltatástesztelő alkalmazás indításakor a következő kimenetnek kell megjelennie.
Testing Udp From Code.
Service is started from code...
Press <ENTER> to terminate the service and start service from config...
Ezután futtathatja a tesztügyfél-alkalmazást a közzétett végpontokon. Az ügyféltesztelési alkalmazás minden végponthoz létrehoz egy ügyfelet, és öt üzenetet küld minden végpontnak. Az alábbi kimenet az ügyfélen található.
Testing Udp From Imported Files Generated By SvcUtil.
0
3
6
9
12
Press <ENTER> to complete test.
A következő a szolgáltatás teljes kimenete.
Service is started from code...
Press <ENTER> to terminate the service and start service from config...
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
adding 0 + 0
adding 1 + 2
adding 2 + 4
adding 3 + 6
adding 4 + 8
Az ügyfélalkalmazás konfigurációval közzétett végpontokon való futtatásához nyomja le az ENTER billentyűt a szolgáltatásban, majd futtassa újra a tesztügyfélt. A szolgáltatásban a következő kimenetnek kell megjelennie.
Testing Udp From Config.
Service is started from config...
Press <ENTER> to terminate the service and exit...
Az ügyfél ismételt futtatása ugyanazt eredményezi, mint az előző eredmények.
Az ügyfélkód és a konfiguráció Svcutil.exe használatával történő újragenerálásához indítsa el a szolgáltatásalkalmazást, majd futtassa a következő Svcutil.exe a minta gyökérkönyvtárából.
svcutil http://localhost:8000/udpsample/ /reference:UdpTransport\bin\UdpTransport.dll /svcutilConfig:svcutil.exe.config
Vegye figyelembe, hogy Svcutil.exe nem hozza létre a kötésbővítmény konfigurációját, SampleProfileUdpBinding
ezért manuálisan kell hozzáadnia.
<configuration>
<system.serviceModel>
<extensions>
<!-- This was added manually because svcutil.exe does not add this extension to the file -->
<bindingExtensions>
<add name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
</bindingExtensions>
</extensions>
</system.serviceModel>
</configuration>
A minta beállítása, összeállítása és futtatása
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ásával kapcsolatos utasításokat.
Tekintse meg az előző "Az UDP tesztszolgáltatás és ügyfél" című szakaszt.