Přenos: UDP

Ukázkový příklad přenosu UDP demonstruje, jak implementovat unicast a multicast jako vlastní transportní vrstvu ve Windows Communication Foundation (WCF). Ukázka popisuje doporučený postup vytvoření vlastního přenosu ve WCF pomocí rozhraní kanálu a následujících osvědčených postupů WCF. Postup vytvoření vlastního transportu je následující:

  1. Rozhodněte, který kanál Message Exchange Patterns (IOutputChannel, IInputChannel, IDuplexChannel, IRequestChannel nebo IReplyChannel) ChannelFactory a ChannelListener budou podporovat. Pak se rozhodněte, jestli budete podporovat varianty relací těchto rozhraní.

  2. Vytvořte objekt pro vytváření kanálů a naslouchací službu, která podporuje váš vzor výměny zpráv.

  3. Zajistěte, aby všechny výjimky specifické pro síť byly normalizovány do příslušné odvozené třídy CommunicationException.

  4. Přidejte prvek bindingu<>, který do kanálového zásobníku přidá vlastní přenos. Další informace naleznete v tématu Přidání elementu vazby.

  5. Přidejte oddíl rozšíření elementu vazby, který zpřístupní nový element vazby do konfiguračního systému.

  6. Přidejte rozšíření metadat pro komunikaci schopností s jinými koncovými body.

  7. Přidejte vazbu, která předem nakonfiguruje sadu prvků vazby podle dobře definovaného profilu. Další informace naleznete v tématu Přidání standardní vazby.

  8. Přidejte sekci vazby a konfigurační element vazby, aby se vazba zpřístupnila konfiguračnímu systému. Další informace naleznete v tématu Přidání podpory konfigurace.

Vzory výměny zpráv

Prvním krokem při psaní vlastního transportu je rozhodnout, které modely výměny zpráv (MEP) jsou pro transport vyžadovány. Existují tři poslanci, kteří si můžou vybrat:

  • Datagram (IInputChannel/IOutputChannel)

    Při použití datagramu MEP odešle klient zprávu pomocí výměny "fire and forget". Systém odeslání bez zpětné vazby je ten, který vyžaduje potvrzení úspěšného doručení mimo hlavní tok. Zpráva může být ztracena při přenosu a nikdy se nedostanou ke službě. Pokud se operace odeslání úspěšně dokončí na straně klienta, nezaručuje, že vzdálený koncový bod obdržel zprávu. Datagram je základním stavebním blokem pro zasílání zpráv, protože nad ním můžete vytvářet vlastní protokoly– včetně spolehlivých protokolů a zabezpečených protokolů. Klientské kanály datagramu implementují rozhraní IOutputChannel, a služební kanály datagramu implementují rozhraní IInputChannel.

  • Žádost-Odpověď (IRequestChannel/IReplyChannel)

    V tomto MEP se odešle zpráva a přijme se odpověď. Vzor se skládá z párů požadavků a odpovědí. Příkladem požadavků a odpovědí jsou vzdálená volání procedur (RPC) a GET dotazy prohlížeče. Tento model se také označuje jako Half-Duplex. V tomto MEP implementují klientské kanály IRequestChannel a kanály služeb IReplyChannel.

  • Duplex (IDuplexChannel)

    Duplexní mep umožňuje, aby klient odeslal libovolný počet zpráv a přijal je v libovolném pořadí. Duplexní MEP je jako telefonní konverzace, kde každé slovo, které je řečeno, je zpráva. Vzhledem k tomu, že obě strany mohou odesílat a přijímat v tomto MEP, rozhraní implementované klientskými a servisními kanály je IDuplexChannel.

Každý z těchto poslanců může také podporovat zasedání. Přidaná funkce poskytovaná kanálem s podporou relací je, že koreluje všechny zprávy odeslané a přijaté na kanálu. Vzor Request-Response je samostatná relace se dvěma zprávami, protože požadavek a odpověď jsou vzájemně propojené. Naproti tomu vzor Request-Response, který podporuje relace, znamená, že všechny páry požadavků a odpovědí na daném kanálu vzájemně korelují. Získáte tak celkem šest členů EP – Datagram, Request-Response, Duplex, Datagram with sessions, Request-Response with sessions, and Duplex with sessions – to si můžete vybrat.

Poznámka:

Pro přenos UDP je jediným podporovaným protokolem MEP datagram, protože UDP je ze své podstaty protokol "fire and forget".

ICommunicationObject a životní cyklus objektu WCF

WCF má běžný stavový automat, který se používá ke správě životního cyklu objektů, jako jsou IChannel, IChannelFactory a IChannelListener, které se používají ke komunikaci. Existuje pět stavů, ve kterých mohou tyto komunikační objekty existovat. Tyto stavy jsou reprezentovány výčtem CommunicationState a jsou následující:

  • Vytvořeno: Jedná se o stav ICommunicationObject při prvním vytvoření instance. V tomto stavu nedojde k žádnému vstupu a výstupu (V/V).

  • Otevření: Objekty přecházejí do tohoto stavu při Open zavolání. V tomto okamžiku jsou vlastnosti neměnné a vstup/výstup může začínat. Tento přechod je platný pouze ze stavu Vytvořeno.

  • Otevřeno: Objekty přecházejí do tohoto stavu po dokončení otevřeného procesu. Tento přechod je platný pouze ze stavu Otevřeno. V tomto okamžiku je objekt plně použitelný pro přenos.

  • Uzavírání: Objekty přecházejí do tohoto stavu, když je volána Close pro řádné vypnutí. Tento přechod je platný pouze ze stavu Otevření.

  • Uzavřeno: Objekty ve stavu Uzavřeno už nejsou použitelné. Obecně platí, že většina konfigurací je stále přístupná pro kontrolu, ale nemůže dojít k žádné komunikaci. Tento stav je ekvivalentem vyřazení.

  • Chyba: V chybném stavu jsou objekty přístupné pro kontrolu, ale už je nelze použít. Pokud dojde k neobnovitelné chybě, objekt přejde do tohoto stavu. Jediný platný přechod z tohoto stavu je do Closed stavu.

Pro každý přechod stavu se aktivují události. Metodu Abort lze volat kdykoli a způsobí, že objekt přejde okamžitě z jeho aktuálního stavu do uzavřeného stavu. Volání Abort ukončí veškerou nedokončenou práci.

Channel Factory a naslouchací proces kanálu

Dalším krokem při psaní vlastního přenosu je vytvoření implementace IChannelFactory pro klientské kanály a IChannelListener pro kanály služeb. Vrstva kanálu používá vzor továrny pro vytváření kanálů. WCF poskytuje pomocné rutiny základní třídy pro tento proces.

V této ukázce je implementace továrny obsažena v UdpChannelFactory.cs a implementace nasluchače je obsažena v UdpChannelListener.cs. Implementace IChannel jsou v UdpOutputChannel.cs a UdpInputChannel.cs.

Továrna na UDP kanály

UdpChannelFactory se odvozuje z ChannelFactoryBase. Ukázka přepisuje GetProperty, aby poskytovala přístup k verzi kodéru zprávy. Ukázka také přepíše OnClose, abychom mohli zrušit naši instanci BufferManager při přechodu stavového automatu.

Výstupní kanál UDP

Komponenta UdpOutputChannel implementuje IOutputChannel. Konstruktor ověří argumenty a vytvoří cílový EndPoint objekt na základě předaného objektu EndpointAddress .

this.socket = new Socket(this.remoteEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);

Kanál může být elegantně uzavřen nebo nehezky. Pokud je kanál uzavřen elegantně, soket je uzavřen a je provedeno volání na metodu základní třídy OnClose. Pokud dojde k výjimce, infrastruktura zavolá Abort k zajištění vyčištění kanálu.

this.socket.Close(0);

Pak implementujeme Send() a BeginSend()/EndSend(). Rozdělí se do dvou hlavních částí. Nejprve zprávu serializujeme do bajtového pole.

ArraySegment<byte> messageBuffer = EncodeMessage(message);

Pak odešleme výsledná data po síti.

this.socket.SendTo(messageBuffer.Array, messageBuffer.Offset, messageBuffer.Count, SocketFlags.None, this.remoteEndPoint);

Posluchač kanálu UDP

Vzorek UdpChannelListener se odvozuje z ChannelListenerBase třídy. K příjmu datagramů používá jeden soket UDP. Metoda OnOpen přijímá data pomocí soketu UDP v asynchronní smyčce. Data se pak převedou na zprávy pomocí architektury Kódování zpráv.

message = MessageEncoderFactory.Encoder.ReadMessage(new ArraySegment<byte>(buffer, 0, count), bufferManager);

Vzhledem k tomu, že stejný kanál datagramu představuje zprávy, které přicházejí z řady zdrojů, je UdpChannelListener singletonový naslouchací proces. Najednou je k tomuto posluchači přidružen nejvýše jeden aktivní IChannel. Ukázkový příklad vygeneruje další pouze tehdy, pokud je kanál vrácený metodou AcceptChannel následně zrušen. Když je zpráva přijata, zařadí se do fronty tohoto jediného kanálu.

UdpInputChannel

Třída UdpInputChannel implementuje IInputChannel. Skládá se z fronty příchozích zpráv, které jsou naplněny soketem UdpChannelListener. Tyto zprávy jsou vyřazeny z fronty metodou IInputChannel.Receive .

Přidání elementu vazby

Teď, když jsou továrny a kanály vytvořené, musíme je zpřístupnit modulu runtime ServiceModel prostřednictvím vazby. Vazba je sada prvků vazby, která představuje komunikační zásobník přidružený k adrese služby. Každý prvek v zásobníku je reprezentován elementem< vazby>.

V ukázce je UdpTransportBindingElementelement vazby , který je odvozen od TransportBindingElement. Přepíše následující metody pro sestavení továren přiřazených k naší vazbě.

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);
}

Obsahuje také členy pro klonování BindingElement a vrácení našeho schématu (soap.udp).

Přidání podpory metadat pro přenosový vazební element

Abychom mohli integrovat přenos do systému metadat, musíme podporovat import i export zásad. To nám umožňuje generovat klienty naší vazby prostřednictvím nástroje ServiceModel Metadata Utility (Svcutil.exe).

Přidání podpory WSDL

Prvek transportní vazby ve vazbě je zodpovědný za export a import adresní informace v metadatech. Při použití vazby SOAP by prvek vazby přenosu měl také exportovat správný transportní identifikátor URI v metadatech.

WSDL Export

Aby mohl exportovat informace o adresování, implementuje UdpTransportBindingElementIWsdlExportExtension rozhraní. Metoda ExportEndpoint přidá správné informace o adresování na port WSDL.

if (context.WsdlPort != null)
{
    AddAddressToWsdlPort(context.WsdlPort, context.Endpoint.Address, encodingBindingElement.MessageVersion.Addressing);
}

Implementace UdpTransportBindingElement metody ExportEndpoint rovněž exportuje transportní URI, pokud koncový bod používá vazbu SOAP.

WsdlNS.SoapBinding soapBinding = GetSoapBinding(context, exporter);
if (soapBinding != null)
{
    soapBinding.Transport = UdpPolicyStrings.UdpNamespace;
}

WSDL importování

Abychom rozšířili systém importu WSDL tak, aby zpracovával import adres, musíme do konfiguračního souboru přidat následující konfiguraci pro Svcutil.exe, jak je znázorněno v souboru Svcutil.exe.config.

<configuration>
  <system.serviceModel>
    <client>
      <metadata>
        <policyImporters>
          <extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
        </policyImporters>
      </metadata>
    </client>
  </system.serviceModel>
</configuration>

Při spuštění Svcutil.exejsou dvě možnosti, jak přimět Svcutil.exe načíst rozšíření WSDL importu.

  1. Nasměrujte Svcutil.exe na náš konfigurační soubor pomocí /SvcutilConfig:<file>.

  2. Přidejte oddíl konfigurace pro Svcutil.exe.config ve stejném adresáři jako Svcutil.exe.

Typ UdpBindingElementImporter implementuje IWsdlImportExtension rozhraní. Metoda ImportEndpoint naimportuje adresu z portu WSDL.

BindingElementCollection bindingElements = context.Endpoint.Binding.CreateBindingElements();
TransportBindingElement transportBindingElement = bindingElements.Find<TransportBindingElement>();
if (transportBindingElement is UdpTransportBindingElement)
{
    ImportAddress(context);
}

Přidání podpory zásad

Element vlastní vazby může v rámci vazby WSDL pro koncový bod služby exportovat výrazy zásad, aby vyjádřil schopnosti tohoto prvku vazby.

Export zásad

Typ UdpTransportBindingElement implementuje IPolicyExportExtension, aby umožnil podporu exportu zásad. V důsledku toho System.ServiceModel.MetadataExporter zahrnuje UdpTransportBindingElement do vytváření zásad pro jakoukoli vazbu, která ji zahrnuje.

V IPolicyExportExtension.ExportPolicy, přidáme kontrolní výraz pro UDP a další kontrolní výraz, pokud jsme v režimu vícesměrového vysílání. Důvodem je to, že režim vícesměrového vysílání ovlivňuje způsob vytváření komunikačního zásobníku, a proto musí být koordinován mezi oběma stranami.

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));
}

Vzhledem k tomu, že vlastní prvky vazby přenosu jsou zodpovědné za zpracování adresování, musí implementace na straně IPolicyExportExtension také zpracovat export požadovaných výrazů zásad WS-Addressing, které udávají verzi WS-Addressing, která se používá.

AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);

Import politiky

Abychom rozšířili systém importu zásad, musíme do konfiguračního souboru přidat následující konfiguraci pro Svcutil.exe, jak je znázorněno v souboru Svcutil.exe.config.

<configuration>
  <system.serviceModel>
    <client>
      <metadata>
        <policyImporters>
          <extension type=" Microsoft.ServiceModel.Samples.UdpBindingElementImporter, UdpTransport" />
        </policyImporters>
      </metadata>
    </client>
  </system.serviceModel>
</configuration>

Pak implementujeme IPolicyImporterExtension z naší registrované třídy (UdpBindingElementImporter). V ImportPolicy() se podíváme na aserce v našem oboru názvů a zpracujeme ty, které mají generovat přenos, a zkontrolujeme, zda jde o vícesměrové vysílání. Musíme také odebrat tvrzení, která zpracováváme, ze seznamu vazebních tvrzení. Při spuštění Svcutil.exeexistují dvě možnosti integrace:

  1. Nasměrujte Svcutil.exe na náš konfigurační soubor pomocí /SvcutilConfig:<file>.

  2. Přidejte oddíl konfigurace pro Svcutil.exe.config ve stejném adresáři jako Svcutil.exe.

Přidání standardní vazby

Náš element vazby lze použít následujícími dvěma způsoby:

  • Prostřednictvím vlastní vazby: Vlastní vazba umožňuje uživateli vytvořit vlastní vazbu založenou na libovolné sadě prvků vazby.

  • Pomocí systémové vazby, která zahrnuje náš prvek vazby. WCF poskytuje řadu těchto systémově definovaných vazeb, například BasicHttpBinding, NetTcpBindinga WsHttpBinding. Každá z těchto vazeb je přiřazená k dobře definovanému profilu.

Ukázka implementuje vazbu profilu SampleProfileUdpBinding, která je odvozena z Binding. Obsahuje SampleProfileUdpBinding až čtyři prvky vazby: UdpTransportBindingElement, TextMessageEncodingBindingElement CompositeDuplexBindingElementa 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();
}

Vytvoření vlastního importéru standardních vazeb

Svcutil.exe a WsdlImporter typ rozpoznává a importuje systémové vazby definované ve výchozím nastavení. V opačném případě se vazba naimportuje jako CustomBinding instance. Aby se povolilo Svcutil.exe a WsdlImporter pro import SampleProfileUdpBinding, UdpBindingElementImporter funguje také jako vlastní importér standardních vazeb.

Importér vlastní standardní vazby implementuje metodu ImportEndpoint na rozhraní IWsdlImportExtension k prozkoumání instance CustomBinding importované z metadat, aby zjistil, zda mohla být vygenerována konkrétní standardní vazbou.

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;
        }
    }
}

Obecně platí, že implementace vlastního importu standardních vazeb zahrnuje kontrolu vlastností importovaných prvků vazby a ověření, že se změnily pouze vlastnosti, které by mohly být nastaveny standardní vazbou, a všechny ostatní vlastnosti jsou jejich výchozí hodnoty. Základní strategií pro implementaci importu standardních vazeb je vytvoření instance standardní vazby, šíření vlastností z prvků vazby do standardní instance vazby, kterou standardní vazba podporuje, a porovnání prvků vazby ze standardní vazby s importovanými prvky vazby.

Přidání podpory konfigurace

Abychom mohli zpřístupnit přenos prostřednictvím konfigurace, musíme implementovat dvě části konfigurace. První je BindingElementExtensionElement pro UdpTransportBindingElement. To znamená, že CustomBinding implementace mohou odkazovat na náš element vazby. Druhá je Configuration pro naše SampleProfileUdpBinding.

Vazební element Rozšiřující element

Oddíl UdpTransportElement je BindingElementExtensionElement, který zpřístupňuje UdpTransportBindingElement konfiguračnímu systému. Pomocí několika základních úprav definujeme název části konfigurace, typ vazby a způsob jejího vytvoření. Pak můžeme naši část rozšíření zaregistrovat v konfiguračním souboru, jak je znázorněno v následujícím kódu.

<configuration>
  <system.serviceModel>
    <extensions>
      <bindingElementExtensions>
        <add name="udpTransport" type="Microsoft.ServiceModel.Samples.UdpTransportElement, UdpTransport" />
      </bindingElementExtensions>
    </extensions>
  </system.serviceModel>
</configuration>

Na rozšíření lze odkazovat z vlastních vazeb, aby se jako přenos používal UDP.

<configuration>
  <system.serviceModel>
    <bindings>
      <customBinding>
       <binding configurationName="UdpCustomBinding">
         <udpTransport/>
       </binding>
      </customBinding>
    </bindings>
  </system.serviceModel>
</configuration>

Oddíl vazby

Oddíl SampleProfileUdpBindingCollectionElement je StandardBindingCollectionElement, který zpřístupňuje SampleProfileUdpBinding konfiguračnímu systému. Většina implementace je delegována na SampleProfileUdpBindingConfigurationElement, která je odvozena od StandardBindingElement. SampleProfileUdpBindingConfigurationElement má vlastnosti, které odpovídají vlastnostem na SampleProfileUdpBinding, a funkce pro mapování z vazby ConfigurationElement. Nakonec přepište metodu OnApplyConfiguration v našem SampleProfileUdpBinding, jak je znázorněno v následujícím vzorovém kódu.

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;
}

Pokud chcete tuto obslužnou rutinu zaregistrovat v konfiguračním systému, přidáme do příslušného konfiguračního souboru následující část.

<configuration>
  <configSections>
     <sectionGroup name="system.serviceModel">
        <sectionGroup name="bindings">
          <section name="sampleProfileUdpBinding" type="Microsoft.ServiceModel.Samples.SampleProfileUdpBindingCollectionElement, UdpTransport" />
        </sectionGroup>
     </sectionGroup>
  </configSections>
</configuration>

Pak se na něj dá odkazovat z konfiguračního oddílu serviceModel.

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

Testovací služba UDP a klient

Testovací kód pro použití tohoto ukázkového přenosu je k dispozici v adresářích UdpTestService a UdpTestClient. Kód služby se skládá ze dvou testů – jeden test nastavuje vazby a koncové body z kódu, zatímco druhý to provádí prostřednictvím konfigurace. Oba testy používají dva koncové body. Jeden koncový bod používá SampleUdpProfileBinding s nastavením <reliableSession> na true. Druhý koncový bod používá vlastní vazbu s UdpTransportBindingElement. To je ekvivalentní použití SampleUdpProfileBinding s <reliableSession> nastaveným na false. Oba testy vytvoří službu, přidají koncový bod pro každou vazbu, otevřou službu a pak počká, až uživatel přejde na ENTER, než službu zavře.

Při spuštění aplikace pro testování služby by se měl zobrazit následující výstup.

Testing Udp From Code.
Service is started from code...
Press <ENTER> to terminate the service and start service from config...

Pak můžete spustit testovací klientskou aplikaci na publikovaných koncových bodech. Klientská testovací aplikace vytvoří klienta pro každý koncový bod a odešle do každého koncového bodu pět zpráv. Následující výstup je v klientovi.

Testing Udp From Imported Files Generated By SvcUtil.
0
3
6
9
12
Press <ENTER> to complete test.

Následuje úplný výstup služby.

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

Pokud chcete spustit klientskou aplikaci pro koncové body publikované pomocí konfigurace, stiskněte klávesu ENTER ve službě a pak znovu spusťte testovacího klienta. Ve službě by se měl zobrazit následující výstup.

Testing Udp From Config.
Service is started from config...
Press <ENTER> to terminate the service and exit...

Opětovné spuštění klienta vrátí stejné jako předchozí výsledky.

Pokud chcete znovu vygenerovat kód klienta a konfiguraci pomocí Svcutil.exe, spusťte aplikaci služby a spusťte následující Svcutil.exe z kořenového adresáře ukázky.

svcutil http://localhost:8000/udpsample/ /reference:UdpTransport\bin\UdpTransport.dll /svcutilConfig:svcutil.exe.config

Všimněte si, že Svcutil.exe negeneruje konfiguraci rozšíření vazby pro nástroj SampleProfileUdpBinding, takže ho musíte přidat ručně.

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

Jak nastavit, sestavit a spustit ukázku

  1. Pro sestavení řešení postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

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

  3. Přečtěte si předchozí část Testovací služba a klient UDP.