Megosztás a következőn keresztül:


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:

  1. 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.

  2. Hozzon létre egy csatorna-előállítót és -figyelőt, amely támogatja az üzenetcsere-mintát.

  3. Győződjön meg arról, hogy a hálózatspecifikus kivételek a megfelelő származtatott osztályra CommunicationExceptionvannak normalizálva.

  4. 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.

  5. 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.

  6. Metaadat-bővítmények hozzáadása a képességek más végpontokkal való kommunikációához.

  7. 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.

  8. 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.

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 UdpChannelListenerszoftvercsatorna 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 UdpTransportBindingElementkö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:

  1. Mutasson Svcutil.exe a konfigurációs fájlra a /SvcutilConfig:<fájl> használatával.

  2. 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.MetadataExporterUdpTransportBindingElement amely tartalmazza azt.

Ebben IPolicyExportExtension.ExportPolicyaz 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 IPolicyExportExtensionUdpTransportBindingElement 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:

  1. Mutasson Svcutil.exe a konfigurációs fájlra a /SvcutilConfig:<fájl> használatával.

  2. 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és WsHttpBinding. Mindegyik kötés egy jól definiált profilhoz van társítva.

A minta a profilkötést SampleProfileUdpBindingvaló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 SampleProfileUdpBindingUdpBindingElementImporter 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 StandardBindingElementszá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ő SampleProfileUdpBindingmintakó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 truehaszná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, SampleProfileUdpBindingezé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

  1. A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.

  2. 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.

  3. Tekintse meg az előző "Az UDP tesztszolgáltatás és ügyfél" című szakaszt.