Aracılığıyla paylaş


Servis Channel-Level Programlama

Bu konuda, System.ServiceModel.ServiceHost ve ilişkili nesne modeli kullanılmadan bir Windows Communication Foundation (WCF) hizmet uygulamasının nasıl yazılacağı açıklanmaktadır.

İleti Alma

İletileri almaya ve işlemeye hazır olmak için aşağıdaki adımlar gereklidir:

  1. Bağlama oluşturun.

  2. Kanal dinleyicisi oluşturun.

  3. Kanal dinleyicisini açın.

  4. İsteği okuyun ve bir yanıt gönderin.

  5. Tüm kanal nesnelerini kapatın.

Bağlama Oluşturma

İletileri dinlemenin ve almanın ilk adımı bağlama oluşturmaktır. WCF, doğrudan bunlardan birinin örneğini oluşturarak kullanılabilecek yerleşik veya sistem tarafından sağlanan çeşitli bağlamalarla birlikte sunulur. Ayrıca, listeleme 1'deki kodun yaptığı gibi bir CustomBinding sınıfı örneği oluşturarak kendi özel bağlamanızı da oluşturabilirsiniz.

Aşağıdaki kod örneği bir System.ServiceModel.Channels.CustomBinding örneği oluşturur ve kanal yığınını oluşturmak için kullanılan bağlama elemanları koleksiyonu olan Elements koleksiyonuna bir System.ServiceModel.Channels.HttpTransportBindingElement öğesi ekler. Bu örnekte, öğe koleksiyonunda yalnızca HttpTransportBindingElementöğesi olduğundan, sonuçta elde edilen kanal yığınında yalnızca HTTP aktarım kanalı bulunur.

ChannelListener Oluşturma

Bağlama oluşturduktan sonra, tür parametresinin oluşturulacak kanal şekli olduğu kanal dinleyicisini oluşturmak için Binding.BuildChannelListener çağrısını yaparız. Bu örnekte, gelen iletileri istek/yanıt iletisi değişim düzeninde dinlemek istediğimiz için kullanıyoruz System.ServiceModel.Channels.IReplyChannel .

IReplyChannel , istek iletilerini almak ve yanıt iletilerini geri göndermek için kullanılır. Çağırma IReplyChannel.ReceiveRequest , istek iletisini almak ve yanıt iletisini geri göndermek için kullanılabilecek bir System.ServiceModel.Channels.IRequestChannel döndürür.

Dinleyiciyi oluştururken, dinlediği ağ adresini (bu örnekte http://localhost:8080/channelapp) geçiririz. Genel olarak, her aktarım kanalı bir veya birden çok adres düzenini destekler; örneğin, HTTP aktarımı hem http hem de https şemalarını destekler.

Bir dinleyici oluştururken boş bir System.ServiceModel.Channels.BindingParameterCollection de geçiririz. Bağlama parametresi, dinleme modülünün nasıl oluşturulması gerektiğini denetleyen parametreleri geçirmeye yönelik bir mekanizmadır. Örneğimizde bu tür parametreler kullanmıyoruz, bu nedenle boş bir koleksiyon geçiriyoruz.

Gelen İletileri Dinleme

Ardından ICommunicationObject.Open işlevini dinleyici üzerinde çağırır ve kanalları kabul etmeye başlarız. davranışı IChannelListener<TChannel>.AcceptChannel , taşımanın bağlantı odaklı mı yoksa bağlantısız mı olduğuna bağlıdır. Bağlantı odaklı aktarımlar için, AcceptChannel yeni bir bağlantı isteği gelene kadar bekler ve bu noktada, yeni bağlantıyı temsil eden yeni bir kanal döndürür. HTTP gibi bağlantısız taşıma yöntemleri için, AcceptChannel aktarım dinleyicisinin oluşturduğu tek kanalla hemen döner.

Bu örnekte dinleyici, IReplyChannel implemente eden bir kanal döndürür. Bu kanala ileti almak için önce bu kanala çağrı ICommunicationObject.Open göndererek iletişim için hazır duruma getirmemiz gerekir. Ardından bir ileti gelene kadar bloklayan ReceiveRequest fonksiyonunu çağırırız.

İsteği Okuma ve Yanıt Gönderme

ReceiveRequest bir RequestContext döndürdüğünde, RequestMessage özelliğini kullanarak alınan mesajı elde ederiz. İletinin eylemini ve gövde içeriğini (bir dize olduğunu varsayıyoruz) yazarız.

Yanıt göndermek için, istekte aldığımız dize verilerini geri geçirerek bu durumda yeni bir yanıt iletisi oluştururuz. Ardından, yanıt iletisini göndermek için ararız Reply .

Nesneleri Kapatma

Kaynakların sızmasını önlemek için, iletişimlerde kullanılan nesnelerin artık gerekli olmadığında kapatılması çok önemlidir. Bu örnekte istek iletisini, istek bağlamını, kanalı ve dinleyiciyi kapatıyoruz.

Aşağıdaki kod örneği, kanal dinleyicisinin yalnızca bir ileti aldığı temel bir hizmeti gösterir. Gerçek bir hizmet, hizmet çıkana kadar kanalları kabul edip ileti almaya devam eder.

using System;
using System.ServiceModel.Channels;
namespace ProgrammingChannels
{
class Service
{
static void RunService()
{
    //Step1: Create a custom binding with just TCP.
    BindingElement[] bindingElements = new BindingElement[2];
    bindingElements[0] = new TextMessageEncodingBindingElement();
    bindingElements[1] = new HttpTransportBindingElement();

    CustomBinding binding = new CustomBinding(bindingElements);

    //Step2: Use the binding to build the channel listener.
    IChannelListener<IReplyChannel> listener =
          binding.BuildChannelListener<IReplyChannel>(
             new Uri("http://localhost:8080/channelapp"),
           new BindingParameterCollection());

    //Step3: Listening for messages.
    listener.Open();
    Console.WriteLine(
           "Listening for incoming channel connections");
    //Wait for and accept incoming connections.
    IReplyChannel channel = listener.AcceptChannel();
    Console.WriteLine("Channel accepted. Listening for messages");
    //Open the accepted channel.
    channel.Open();
    //Wait for and receive a message from the channel.
    RequestContext request= channel.ReceiveRequest();
    //Step4: Reading the request message.
    Message message = request.RequestMessage;
    Console.WriteLine("Message received");
    Console.WriteLine($"Message action: {message.Headers.Action}");
    string data=message.GetBody<string>();
    Console.WriteLine($"Message content: {data}");
    //Send a reply.
    Message replymessage=Message.CreateMessage(
        binding.MessageVersion,
        "http://contoso.com/someotheraction",
         data);
    request.Reply(replymessage);
    //Step5: Closing objects.
    //Do not forget to close the message.
    message.Close();
    //Do not forget to close RequestContext.
    request.Close();
    //Do not forget to close channels.
    channel.Close();
    //Do not forget to close listeners.
    listener.Close();
}
public static void Main()
{
    Service.RunService();
    Console.WriteLine("Press enter to exit");
    Console.ReadLine();
}
}
}
Imports System.ServiceModel.Channels

Namespace ProgrammingChannels
    Friend Class Service

        Private Shared Sub RunService()

            'Step1: Create a custom binding with just TCP.
            Dim bindingElements(1) As BindingElement = {New TextMessageEncodingBindingElement(), _
                                                        New HttpTransportBindingElement()}

            Dim binding As New CustomBinding(bindingElements)

            'Step2: Use the binding to build the channel listener.         
            Dim listener = binding.BuildChannelListener(Of IReplyChannel)(New Uri("http://localhost:8080/channelapp"), _
                                                                          New BindingParameterCollection())

            'Step3: Listening for messages.
            listener.Open()
            Console.WriteLine("Listening for incoming channel connections")

            'Wait for and accept incoming connections.
            Dim channel = listener.AcceptChannel()
            Console.WriteLine("Channel accepted. Listening for messages")

            'Open the accepted channel.
            channel.Open()

            'Wait for and receive a message from the channel.
            Dim request = channel.ReceiveRequest()

            'Step4: Reading the request message.
            Dim message = request.RequestMessage
            Console.WriteLine("Message received")
            Console.WriteLine("Message action: {0}", message.Headers.Action)
            Dim data = message.GetBody(Of String)()
            Console.WriteLine("Message content: {0}", data)
            'Send a reply.
            Dim replymessage = Message.CreateMessage(binding.MessageVersion, _
                                                     "http://contoso.com/someotheraction", data)
            request.Reply(replymessage)
            'Step5: Closing objects.
            'Do not forget to close the message.
            message.Close()
            'Do not forget to close RequestContext.
            request.Close()
            'Do not forget to close channels.
            channel.Close()
            'Do not forget to close listeners.
            listener.Close()
        End Sub

        Public Shared Sub Main()

            Service.RunService()
            Console.WriteLine("Press enter to exit")
            Console.ReadLine()

        End Sub

    End Class
End Namespace