Aracılığıyla paylaş


Taşıma: UDP

UDP Aktarım örneği, UDP tek noktaya yayın ve çok noktaya yayının özel bir Windows Communication Foundation (WCF) aktarımı olarak nasıl uygulanduğunu gösterir. Örnek, kanal çerçevesini kullanarak ve WCF en iyi yöntemlerini izleyerek WCF'de özel aktarım oluşturmak için önerilen yordamı açıklar. Özel aktarım oluşturma adımları aşağıdaki gibidir:

  1. ChannelFactory ve ChannelListener'inizin hangi kanal İleti Değişimi Desenlerini (IOutputChannel, IInputChannel, IDuplexChannel, IRequestChannel veya IReplyChannel) destekleyeceğine karar verin. Ardından bu arabirimlerin oturumlu varyasyonlarını destekleyip desteklemeyeceğine karar verin.

  2. İleti Değişimi Deseninizi destekleyen bir kanal fabrikası ve dinleyici oluşturun.

  3. Ağa özgü özel durumların uygun türetilmiş sınıfına normalleştirildiğinden CommunicationExceptionemin olun.

  4. Özel aktarımı bir <kanal yığınına ekleyen bir bağlama> öğesi ekleyin. Daha fazla bilgi için bkz . Bağlama Öğesi Ekleme.

  5. Yeni bağlama öğesini yapılandırma sisteminde kullanıma açmak için bir bağlama öğesi uzantısı bölümü ekleyin.

  6. Özellikleri diğer uç noktalara iletmek için meta veri uzantıları ekleyin.

  7. İyi tanımlanmış bir profile göre bağlama öğeleri yığınını önceden yapılandıran bir bağlama ekleyin. Daha fazla bilgi için bkz . Standart Bağlama Ekleme.

  8. Bağlamayı yapılandırma sistemine göstermek için bağlama bölümü ve bağlama yapılandırma öğesi ekleyin. Daha fazla bilgi için bkz . Yapılandırma Desteği Ekleme.

İleti Değişimi Desenleri

Özel aktarım yazmanın ilk adımı, aktarım için hangi İleti Değişimi Desenlerinin (MEP' ler) gerekli olduğuna karar vermektir. Aralarından seçim yapabileceğiniz üç MEP vardır:

  • Veri Birimi (IInputChannel/IOutputChannel)

    Bir veri birimi MEP'i kullanırken, istemci "tetikle ve unut" değişimini kullanarak bir ileti gönderir. Ateş ve unutma değişimi, bant dışı başarılı teslimat onayı gerektiren bir işlemdir. İleti aktarım sırasında kaybolabilir ve hizmete hiç ulaşmayabilir. gönderme işlemi istemci ucunda başarıyla tamamlanırsa, uzak uç noktanın iletiyi aldığını garanti etmez. Veri birimi, güvenilir protokoller ve güvenli protokoller dahil olmak üzere kendi protokollerinizi oluşturabileceğinizden mesajlaşma için temel bir yapı taşıdır. İstemci veri birimi kanalları arabirimi uygular IOutputChannel ve hizmet veri birimi kanalları arabirimi uygular IInputChannel .

  • İstek Yanıtı (IRequestChannel/IReplyChannel)

    Bu MEP'te bir ileti gönderilir ve bir yanıt alınır. Desen, istek-yanıt çiftlerinden oluşur. İstek yanıt çağrılarına örnek olarak uzaktan yordam çağrıları (RPC) ve tarayıcı GET'leri verilebilir. Bu desen Yarı Çift Yönlü olarak da bilinir. Bu MEP'te istemci kanalları uygular IRequestChannel ve hizmet kanalları uygular IReplyChannel.

  • Çift Yönlü (IDuplexChannel)

    Çift yönlü MEP, bir istemci tarafından rastgele sayıda ileti gönderilmesine ve herhangi bir sırayla alınmasına izin verir. Çift yönlü MEP, konuşulan her sözcüğün bir ileti olduğu bir telefon konuşması gibidir. Her iki taraf da bu MEP'te gönderip alabildiği için, istemci ve hizmet kanalları tarafından uygulanan arabirim şeklindedir IDuplexChannel.

Bu MEP'lerin her biri oturumları da destekleyebilir. Oturum kullanan bir kanal tarafından sağlanan eklenen işlevler, kanalda gönderilen ve alınan tüm iletileri ilişkilendirmesidir. İstek ve yanıt bağıntılı olduğundan, İstek-Yanıt düzeni tek başına iki iletili bir oturumdur. Buna karşılık, oturumları destekleyen İstek-Yanıt düzeni, bu kanaldaki tüm istek/yanıt çiftlerinin birbiriyle ilişkili olduğunu gösterir. Bu, aralarından seçim yapabileceğiniz toplam altı MEP (Veri Birimi, İstek-Yanıt, Çift Yönlü, Oturumlu Veri Birimi, Oturumlarla İstek-Yanıt ve Oturumlarla Çift Yönlü) sağlar.

Not

UDP aktarımı için desteklenen tek MEP Datagram'dır çünkü UDP doğal olarak bir "tetikle ve unut" protokolüdür.

ICommunicationObject ve WCF nesne yaşam döngüsü

WCF, , gibi IChannelIChannelFactorynesnelerin yaşam döngüsünü yönetmek için kullanılan ve IChannelListener iletişim için kullanılan ortak bir durum makinesine sahiptir. Bu iletişim nesnelerinin var olabileceği beş durum vardır. Bu durumlar numaralandırma ile CommunicationState temsil edilir ve aşağıdaki gibidir:

  • Oluşturuldu: Bu, ICommunicationObject örneğin ilk kez oluşturulduğu durumdur. Bu durumda giriş/çıkış (G/Ç) oluşmaz.

  • Açma: Nesneler çağrıldığında Open bu duruma geçirilir. Bu noktada özellikler sabit hale getirilir ve giriş/çıkış başlayabilir. Bu geçiş yalnızca Oluşturuldu durumundan geçerlidir.

  • Açık: Açık işlem tamamlandığında nesneler bu duruma geçirilir. Bu geçiş yalnızca Açma durumundan geçerlidir. Bu noktada, nesne aktarım için tamamen kullanılabilir.

  • Kapatma: Nesneler düzgün bir kapatma için çağrıldığında Close bu duruma geçirilir. Bu geçiş yalnızca Açık durumdan geçerlidir.

  • Kapalı: Kapalı durumundaki nesneler artık kullanılamaz. Genel olarak, çoğu yapılandırmaya denetim için hala erişilebilir, ancak hiçbir iletişim gerçekleşemez. Bu durum, atılmakla eşdeğerdir.

  • Hatalı: Hatalı durumdaki nesnelere denetim erişilebilir ancak artık kullanılamaz. Kurtarılamayan bir hata oluştuğunda, nesne bu duruma geçirildi. Bu durumdan tek geçerli geçiş duruma geçer Closed .

Her durum geçişi için tetikleyen olaylar vardır. Abort yöntemi herhangi bir zamanda çağrılabilir ve nesnenin geçerli durumundan kapalı duruma hemen geçmesine neden olur. Çağrılması Abort , tamamlanmamış tüm işleri sonlandırır.

Kanal Fabrikası ve Kanal Dinleyicisi

Özel aktarım yazmanın bir sonraki adımı, istemci kanalları ve IChannelListener hizmet kanalları için uygulamasını IChannelFactory oluşturmaktır. Kanal katmanı, kanal oluşturmak için bir fabrika deseni kullanır. WCF, bu işlem için temel sınıf yardımcıları sağlar.

Bu örnekte, fabrika uygulaması UdpChannelFactory.cs ve dinleyici uygulaması UdpChannelListener.cs içinde yer alır. Uygulamalar IChannel UdpOutputChannel.cs ve UdpInputChannel.cs.

UDP Kanal Fabrikası

, UdpChannelFactory 'den ChannelFactoryBasetüretilir. Örnek, ileti kodlayıcının ileti sürümüne erişim sağlamak için geçersiz kılar GetProperty . Örnek ayrıca durum makinesinin geçiş yaptığı zaman örneğimizi BufferManager yok edebilmemiz için geçersiz kılarOnClose.

UDP Çıkış Kanalı

uygular UdpOutputChannelIOutputChannel. Oluşturucu, bağımsız değişkenleri doğrular ve geçirilene göre EndpointAddress bir hedef EndPoint nesnesi oluşturur.

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

Kanal düzgün veya düzgün bir şekilde kapatılabilir. Kanal düzgün bir şekilde kapatılırsa yuva kapatılır ve temel sınıf OnClose yöntemine bir çağrı yapılır. Bu bir özel durum oluşturursa, altyapı kanalın temizlendiğinden emin olmak için çağırır Abort .

this.socket.Close(0);

Ardından ve BeginSend()/EndSend()uygularız.Send() Bu iki ana bölüme ayrılır. İlk olarak iletiyi bir bayt dizisi halinde serileştiririz.

ArraySegment<byte> messageBuffer = EncodeMessage(message);

Ardından elde edilen verileri kabloya göndeririz.

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

The UdpChannelListener

UdpChannelListener Örneğin uyguladığı, sınıfından ChannelListenerBase türetilir. Veri birimlerini almak için tek bir UDP yuvası kullanır. yöntemi, OnOpen zaman uyumsuz bir döngüde UDP yuvasını kullanarak veri alır. Veriler daha sonra İleti Kodlama Çerçevesi kullanılarak iletilere dönüştürülür.

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

Aynı veri birimi kanalı bir dizi kaynaktan gelen iletileri temsil ettiğinden, UdpChannelListener tek bir dinleyicidir. Bu dinleyiciyle aynı anda en fazla bir etkin IChannel ilişkili vardır. Örnek, yalnızca yöntemi tarafından AcceptChannel döndürülen bir kanal daha sonra atılırsa başka bir kanal oluşturur. Bir ileti alındığında, bu tek kanala sıralanır.

UdpInputChannel

UdpInputChannel sınıfı uygularIInputChannel. 'nin yuvası tarafından UdpChannelListenerdoldurulan bir gelen ileti kuyruğundan oluşur. Bu iletiler yöntemi tarafından IInputChannel.Receive sıralanır.

Bağlama Öğesi Ekleme

Artık fabrikalar ve kanallar oluşturulduğuna göre, bunları bağlama aracılığıyla ServiceModel çalışma zamanına sunmamız gerekir. Bağlama, bir hizmet adresiyle ilişkili iletişim yığınını temsil eden bağlama öğeleri koleksiyonudur. Yığındaki her öğe bir <bağlama> öğesiyle temsil edilir.

Örnekte bağlama öğesi öğesinden UdpTransportBindingElementTransportBindingElementtüretilir. Bağlamamızla ilişkili fabrikaları oluşturmak için aşağıdaki yöntemleri geçersiz kılar.

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

Ayrıca, öğesini kopyalama BindingElement ve şemamızı (soap.udp) döndürmeye yönelik üyeleri de içerir.

Aktarım Bağlama Öğesi için Meta Veri Desteği Ekleme

Aktarımlarımızı meta veri sistemiyle tümleştirmek için ilkenin içeri ve dışarı aktarılmasını desteklememiz gerekir. Bu, ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) aracılığıyla bağlamamızın istemcilerini oluşturmamızı sağlar.

WSDL Desteği Ekleme

Bağlamadaki aktarım bağlama öğesi, meta verilerdeki adresleme bilgilerini dışarı ve içeri aktarmakla sorumludur. SOAP bağlaması kullanılırken, aktarım bağlama öğesi de meta verilerde doğru bir aktarım URI'sini dışarı aktarmalıdır.

WSDL Dışarı Aktarma

Adresleme bilgilerini UdpTransportBindingElement dışarı aktarmak için arabirimini IWsdlExportExtension uygular. yöntemi WSDL ExportEndpoint bağlantı noktasına doğru adresleme bilgilerini ekler.

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

Yönteminin UdpTransportBindingElementExportEndpoint uygulanması, uç nokta BIR SOAP bağlaması kullandığında bir aktarım URI'sini de dışarı aktarır.

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

WSDL İçeri Aktarma

WSDL içeri aktarma sistemini adresleri içeri aktarmayı işleyecek şekilde genişletmek için, Svcutil.exe.config dosyasında gösterildiği gibi Svcutil.exe için yapılandırma dosyasına aşağıdaki yapılandırmayı eklemeliyiz.

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

Svcutil.exe çalıştırırken WSDL içeri aktarma uzantılarını yüklemek için Svcutil.exe almak için iki seçenek vardır:

  1. /SvcutilConfig:<file> dosyasını kullanarak yapılandırma dosyamıza Svcutil.exe işaret edin.

  2. yapılandırma bölümünü Svcutil.exe ile aynı dizindeki Svcutil.exe.config'e ekleyin.

türü UdpBindingElementImporter arabirimini IWsdlImportExtension uygular. yöntemi, ImportEndpoint WSDL bağlantı noktasından adresi içeri aktarır.

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

İlke Desteği Ekleme

Özel bağlama öğesi, bir hizmet uç noktası için WSDL bağlamasında ilke onaylarını dışarı aktararak bu bağlama öğesinin özelliklerini ifade edebilir.

İlke Dışarı Aktarma

türü, UdpTransportBindingElement ilke dışarı aktarma desteği eklemek için uygulanır IPolicyExportExtension . Sonuç olarak, System.ServiceModel.MetadataExporter ilkeyi içeren UdpTransportBindingElement tüm bağlamalar için ilkenin oluşturulmasını içerir.

içinde IPolicyExportExtension.ExportPolicy, çok noktaya yayın modundaysak UDP için bir onay ve başka bir onay ekleriz. Bunun nedeni, çok noktaya yayın modunun iletişim yığınının nasıl oluşturulacağı ve bu nedenle her iki taraf arasında eşgüdümlü olması gerektiğidir.

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

Özel aktarım bağlama öğeleri adreslemeden sorumlu olduğundan, IPolicyExportExtension üzerindeki UdpTransportBindingElement uygulama, kullanılmakta olan WS-Addressing sürümünü belirtmek için uygun WS-Adresleme ilkesi onaylarını dışarı aktarmayı da işlemelidir.

AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);

İlke İçeri Aktarma

İlke İçeri Aktarma sistemini genişletmek için, Svcutil.exe.config dosyasında gösterildiği gibi Svcutil.exe yapılandırma dosyasına aşağıdaki yapılandırmayı eklemeliyiz.

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

Ardından kayıtlı sınıfımızdan (UdpBindingElementImporter) uygularızIPolicyImporterExtension. içinde ImportPolicy(), ad alanımızdaki onaylara göz atıp taşımayı oluşturmaya yönelik onayları işler ve çok noktaya yayın olup olmadığını denetleriz. Ayrıca işlediğimiz onayları bağlama onayları listesinden de kaldırmamız gerekir. Svcutil.exe çalıştırırken iki tümleştirme seçeneği vardır:

  1. /SvcutilConfig:<file> dosyasını kullanarak yapılandırma dosyamıza Svcutil.exe işaret edin.

  2. yapılandırma bölümünü Svcutil.exe ile aynı dizindeki Svcutil.exe.config'e ekleyin.

Standart Bağlama Ekleme

Bağlama öğemiz aşağıdaki iki yolla kullanılabilir:

  • Özel bağlama aracılığıyla: Özel bağlama, kullanıcının rastgele bir bağlama öğeleri kümesine göre kendi bağlamasını oluşturmasına olanak tanır.

  • Bağlama öğemizi içeren sistem tarafından sağlanan bir bağlama kullanarak. WCF, , ve WsHttpBindinggibi BasicHttpBindingNetTcpBindingbu sistem tanımlı bağlamalardan bir dizi sağlar. Bu bağlamaların her biri iyi tanımlanmış bir profille ilişkilendirilir.

Örnek, dosyasından Bindingtüretilen profil bağlamasını SampleProfileUdpBindinguygular. içinde SampleProfileUdpBinding en fazla dört bağlama öğesi içerir: UdpTransportBindingElement, TextMessageEncodingBindingElement CompositeDuplexBindingElementve 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();
}

Özel Standart Bağlama İçeri Aktarıcı ekleme

Svcutil.exe ve WsdlImporter türü varsayılan olarak sistem tanımlı bağlamaları tanır ve içeri aktarır. Aksi takdirde bağlama örnek CustomBinding olarak içeri aktarılır. Svcutil.exe etkinleştirmek ve WsdlImporter içeri aktarmak SampleProfileUdpBindingUdpBindingElementImporter için de özel bir standart bağlama içeri aktarıcı işlevi görür.

Özel standart bağlama içeri aktarıcısı, meta verilerden içeri aktarılan örneği inceleyerek CustomBinding belirli bir standart bağlama tarafından oluşturulup oluşturulmadığını görmek için arabiriminde yöntemini IWsdlImportExtension uygularImportEndpoint.

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

Genel olarak, özel bir standart bağlama içeri aktarıcısı uygulamak, yalnızca standart bağlama tarafından ayarlanmış olabilecek özelliklerin değiştiğini ve diğer tüm özelliklerin varsayılanları olduğunu doğrulamak için içeri aktarılan bağlama öğelerinin özelliklerini denetlemeyi içerir. Standart bağlama içeri aktarıcısı uygulamak için temel bir strateji, standart bağlamanın bir örneğini oluşturmak, bağlama öğelerinden standart bağlamanın desteklediği standart bağlama örneğine özellikleri yaymak ve standart bağlamadaki bağlama öğelerini içeri aktarılan bağlama öğeleriyle karşılaştırmaktır.

Yapılandırma Desteği Ekleme

Taşımamızı yapılandırma aracılığıyla kullanıma sunmamız için iki yapılandırma bölümü uygulamamız gerekir. İlki için UdpTransportBindingElementbir'dirBindingElementExtensionElement. Bu, uygulamaların bağlama öğemize başvurabilmesi için CustomBinding yapılır. İkincisi bizim SampleProfileUdpBindingiçin birConfiguration.

Bağlama Öğesi Uzantısı Öğesi

bölümü, yapılandırma sistemini kullanıma sunan UdpTransportBindingElement bir BindingElementExtensionElement bölümdürUdpTransportElement. Birkaç temel geçersiz kılma ile yapılandırma bölümü adımızı, bağlama öğemizin türünü ve bağlama öğemizi nasıl oluşturacağımızı tanımlarız. Ardından uzantı bölümümüzü aşağıdaki kodda gösterildiği gibi bir yapılandırma dosyasına kaydedebiliriz.

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

Uzantıya, aktarım olarak UDP kullanmak için özel bağlamalardan başvurulabilir.

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

Bağlama Bölümü

bölümü, yapılandırma sistemini kullanıma sunan SampleProfileUdpBinding bir StandardBindingCollectionElement bölümdürSampleProfileUdpBindingCollectionElement. Uygulamanın büyük bir kısmı, 'den StandardBindingElementtüretilen öğesine temsilci olarak atandıSampleProfileUdpBindingConfigurationElement. , SampleProfileUdpBindingConfigurationElement üzerindeki SampleProfileUdpBindingözelliklere karşılık gelen özelliklere ve bağlamadan eşlemek için işlevlere ConfigurationElement sahiptir. Son olarak, aşağıdaki örnek kodda gösterildiği gibi bizim SampleProfileUdpBindingiçindeki yöntemini geçersiz kılınOnApplyConfiguration.

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

Bu işleyiciyi yapılandırma sistemine kaydetmek için aşağıdaki bölümü ilgili yapılandırma dosyasına ekleyeceğiz.

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

Daha sonra serviceModel yapılandırma bölümünden başvurulabilir.

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

UDP Test Hizmeti ve İstemcisi

Bu örnek aktarımı kullanmak için test kodu UdpTestService ve UdpTestClient dizinlerinde kullanılabilir. Hizmet kodu iki testten oluşur: testlerden biri koddan bağlamaları ve uç noktaları ayarlar ve diğeri bunu yapılandırma yoluyla yapar. Her iki test de iki uç nokta kullanır. Bir uç nokta, reliableSession> olarak ayarlanmış trueolan< öğesini SampleUdpProfileBinding kullanır. Diğer uç nokta ile UdpTransportBindingElementözel bağlama kullanır. Bu, reliableSession> olarak ayarlanmış falseolarak< kullanmaya SampleUdpProfileBinding eşdeğerdir. Her iki test de bir hizmet oluşturur, her bağlama için bir uç nokta ekler, hizmeti açar ve ardından hizmeti kapatmadan önce kullanıcının ENTER tuşuna basmasını bekler.

Hizmet testi uygulamasını başlattığınızda aşağıdaki çıkışı görmeniz gerekir.

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

Ardından test istemci uygulamasını yayımlanan uç noktalarda çalıştırabilirsiniz. İstemci test uygulaması her uç nokta için bir istemci oluşturur ve her uç noktaya beş ileti gönderir. aşağıdaki çıkış istemcidedir.

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

Hizmette tam çıkış aşağıdadır.

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

İstemci uygulamasını yapılandırma kullanılarak yayımlanan uç noktalara karşı çalıştırmak için hizmette ENTER tuşuna basın ve ardından test istemcisini yeniden çalıştırın. Hizmette aşağıdaki çıkışı görmeniz gerekir.

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

İstemciyi yeniden çalıştırmak, önceki sonuçlarla aynı sonucu verir.

Svcutil.exe kullanarak istemci kodunu ve yapılandırmasını yeniden oluşturmak için hizmet uygulamasını başlatın ve ardından örneğin kök dizininden aşağıdaki Svcutil.exe çalıştırın.

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

Svcutil.exe için SampleProfileUdpBindingbağlama uzantısı yapılandırmasını oluşturmadığını, bu nedenle el ile eklemeniz gerektiğini unutmayı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>

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  2. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.

  3. Önceki "UDP Test Hizmeti ve İstemcisi" bölümüne bakın.