Aracılığıyla paylaş


Aktarım: 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 olan CommunicationException'e normalleştirildiğinden emin 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 datagram MEP kullanırken, istemci "ateşle 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. Datagram, güvenilir protokoller ve güvenli protokoller de dahil olmak üzere üzerine kendi protokollerinizi inşa edebileceğiniz için mesajlaşma için temel bir yapı taşıdır. İstemci datagram kanalları IOutputChannel arabirimini uygular ve hizmet datagram kanalları IInputChannel arabirimini uygular.

  • Request-Response (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 Half-Duplex olarak da bilinir. Bu MEP'te istemci kanalları IRequestChannel, hizmet kanalları ise IReplyChannel uygular.

  • Çift Yönlü (IDuplexChannel)

    Çift yönlü MEP, bir istemcinin rastgele sayıda mesaj göndermesine ve bunları herhangi bir sırayla almasına olanak tanır. Çift yönlü MEP, konuşulan her sözcüğün bir ileti olduğu bir telefon konuşması gibidir. Her iki tarafın bu MEP'te gönderip alabilmesi nedeniyle, istemci ve hizmet kanalları tarafından uygulanan arabirim IDuplexChannel'dir.

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 Request-Response deseni, iki mesajlık bağımsız bir oturumdur. Buna karşılık, oturumları destekleyen Request-Response deseni, kanaldaki tüm istek/yanıt çiftlerinin birbiriyle ilişkili olduğunu gösterir. Bu, aralarından seçim yapabileceğiniz toplam altı MEP—Datagram, İstek-Yanıt, Çift Yönlü, Oturumlu Datagram, Oturumlu Request-Response ve Oturumlu Çift Yönlü—sağlar.

Uyarı

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, IChannel, IChannelFactory ve IChannelListener gibi nesnelerin yaşam döngüsünü yönetmek için kullanılan ortak bir durum makinesine sahiptir ve bu nesneler iletişim için kullanılır. 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ği ilk kez oluşturulduğundaki durumdur. Bu durumda giriş/çıkış (G/Ç) oluşmaz.

  • Başlatma: Open çağrıldığında nesneler bu duruma geçer. 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 Close çağrıldığında bu duruma geçer. 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, bertaraf edilmekle eşdeğerdir.

  • Hatalı: Hatalı durumundaki nesneler denetim için 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ş, Closed durumuna olmaktır.

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

Kanal Fabrikası ve Kanal Dinleyicisi

Özel aktarım yazmanın bir sonraki adımı, IChannelFactory'ın istemci kanalları ve IChannelListener'ın hizmet kanalları için uygulamalarını 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 dosyalarında yer almaktadır.

UDP Kanal Fabrikası

UdpChannelFactory, ChannelFactoryBase'den türetilir. İleti kodlayıcısının sürümüne erişim sağlamak için örnek GetProperty'ü aşar. Örnek ayrıca durum makinesi geçiş yaptığında OnClose örneğimizi yok edebilmemiz için BufferManager’yi geçersiz kılar.

UDP Çıkış Kanalı

UdpOutputChannel IOutputChannel uygular. Oluşturucu, bağımsız değişkenleri doğrular ve iletilen EndPoint öğesine göre bir hedef EndpointAddress nesnesi oluşturur.

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

Kanal zarif bir şekilde veya zarif olmayan 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ı Abort'yi çağırır ki kanal temizlenmiş olsun.

this.socket.Close(0);

Ardından Send() ve BeginSend()/EndSend() uygularız. 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);

Udp Kanalı Dinleyicisi

Örneğin uyguladığı UdpChannelListener, ChannelListenerBase sınıfından türetilir. Veri birimlerini almak için tek bir UDP yuvası kullanır. OnOpen yöntemi, UDP soketini kullanan zaman uyumsuz bir döngüde 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ı datagram kanalı bir dizi kaynaktan gelen iletileri temsil ettiğinden, UdpChannelListener tek bir dinleyicidir. Dinleyiciyle aynı anda en fazla bir etkin IChannel ilişkilendirilebilir. Örnek, yalnızca AcceptChannel metot tarafından döndürülen bir kanal daha sonra atılırsa, bir başka kanal üretir. Bir ileti alındığında, bu singleton kanala sıralanır.

UDP Giriş Kanalı

UdpInputChannel sınıfı IInputChannel uygular. Bu, UdpChannelListener'nin yuvası tarafından doldurulan bir gelen mesaj kuyruğundan oluşur. Bu iletiler IInputChannel.Receive yöntemi tarafından sıradan çıkarılır.

Bağlama Öğesi Ekleme

Artık fabrikalar ve kanallar oluşturulduğuna göre, bunları bir bağlayıcı 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 UdpTransportBindingElement'den türeyen bağlama öğesi TransportBindingElement'dir. 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, BindingElement öğesini klonlamak ve şemamızı (soap.udp) döndürmek için ü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 dışa aktarmak için UdpTransportBindingElement 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ıldığında, WSDL içeri aktarma uzantılarını yüklemek amacıyla 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.exeile aynı dizindeki Svcutil.exe.config ekleyin.

UdpBindingElementImporter türü IWsdlImportExtension arabirimini 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);
}

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

Politika Dışa Aktarma

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

IPolicyExportExtension.ExportPolicy içinde, UDP için bir doğrulama ve çok noktaya yayın modundaysak başka bir doğrulama ekleriz. Çünkü çok noktaya yayın modu, iletişim yığınının nasıl yapılandırılacağını etkiler ve bu nedenle her iki taraf arasında eşgüdümlü olmalıdır.

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 adresleme işlemiyle yükümlü olduğundan, IPolicyExportExtension üzerindeki UdpTransportBindingElement uygulaması, kullanılmakta olan WS-Addressing sürümünü belirtmek için uygun WS-Addressing ilkesi koşullarını da dışarı aktarmaktan sorumludur.

AddWSAddressingAssertion(context, encodingBindingElement.MessageVersion.Addressing);

Politika İçe 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 (IPolicyImporterExtension) UdpBindingElementImporter uygularız. ImportPolicy() içinde, ad alanımızdaki doğrulamalara göz atarız, taşıma oluşturmaya yönelik olanları işleriz ve çok noktaya yayın olup olmadığını kontrol ederiz. Ayrıca işlediğimiz onayları bağlayıcı onaylar listesinden de kaldırmamız gerekir. Yine, 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.exeile aynı dizindeki Svcutil.exe.config 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.

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

Örnek, SampleProfileUdpBinding'den türetilen Binding içinde profil bağlamasını uygular. 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 bir 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 ve WsdlImporter'nın SampleProfileUdpBinding içe aktarmasını etkinleştirmek için, UdpBindingElementImporter ayrıca özel bir standart bağlama içeri aktarıcı olarak görev yapar.

Özel bir standart bağlama içeri aktarıcısı, bir ImportEndpoint örneğini meta verilerden içeri aktardıktan sonra, bunun belirli bir standart bağlama tarafından üretilip üretilmediğini kontrol etmek amacıyla IWsdlImportExtension arabiriminde CustomBinding yöntemini uygular.

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şımacılığımızı yapılandırma yoluyla erişilebilir hale getirmek için iki yapılandırma bölümü uygulamamız gerekir. İlki BindingElementExtensionElementUdpTransportBindingElement içindir. Bu, uygulamaların bağlama öğemize başvurabilmesi için CustomBinding yapılır. İkincisi bizim Configurationiçin birSampleProfileUdpBinding.

Bağlama Uzantısı Öğesi

Bölüm UdpTransportElement, BindingElementExtensionElement'yi yapılandırma sistemine tanıtan bir UdpTransportBindingElement'dır. 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 SampleProfileUdpBindingCollectionElement, StandardBindingCollectionElement'yi yapılandırma sistemine tanıtan bir SampleProfileUdpBinding'dır. Uygulamanın büyük bir kısmı, SampleProfileUdpBindingConfigurationElement'den türetilen StandardBindingElement'a devredildi. SampleProfileUdpBindingConfigurationElement üzerinde, SampleProfileUdpBinding üzerindeki özelliklere karşılık gelen özellikler ve ConfigurationElement bağlamasından eşlemek için işlevler bulunmaktadır. Son olarak, aşağıdaki örnek kodda gösterildiği gibi OnApplyConfiguration yöntemini SampleProfileUdpBinding içindeki geçersiz kılın.

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 SampleUdpProfileBinding ayarlandığı bir durumda < kullanır. Diğer uç nokta, UdpTransportBindingElement özel bağlamayı kullanır. Bu, SampleUdpProfileBinding, <reliableSession>false olarak ayarlandı şeklinde kullanmaya 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 sonuç istemcide bulunuyor.

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

Hizmetin tam çıktısı aşağıda verilmiştir.

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 şu çıktıyı 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.exekullanarak 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 bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.

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