Aracılığıyla paylaş


Çift Yönlü İletişim

İki Yönlü örneği , MSMQ üzerinden işlem yapılmış iki yönlü kuyruğa alınmış iletişimin nasıl gerçekleştirileceklerini gösterir. Bu örnek bağlamayı netMsmqBinding kullanır. Bu durumda hizmet, kuyruğa alınmış iletileri alan hizmeti gözlemlemenizi sağlayan şirket içinde barındırılan bir konsol uygulamasıdır.

Not

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Bu örnek, İşlem Yapılan MSMQ Bağlamasını temel alır.

Kuyruğa alınan iletişimde, istemci bir kuyruk kullanarak hizmetle iletişim kurar. İstemci bir kuyruğa ileti gönderir ve hizmet kuyruktan ileti alır. Bu nedenle hizmet ve istemcinin kuyruk kullanarak iletişim kurmak için aynı anda çalışması gerekmez.

Bu örnekte kuyruklar kullanılarak 2 yönlü iletişim gösterilmektedir. İstemci, satın alma siparişlerini bir işlem kapsamından kuyruğa gönderir. Hizmet siparişleri alır, siparişi işler ve ardından bir işlem kapsamında kuyruktan siparişin durumuyla istemciyi geri çağırır. İki yönlü iletişimi kolaylaştırmak için hem istemci hem de hizmet, satın alma siparişlerini ve sipariş durumunu sıralamak için kuyrukları kullanır.

Hizmet sözleşmesi IOrderProcessor , kuyruğa alma kullanımına uygun tek yönlü hizmet işlemlerini tanımlar. Hizmet işlemi, sipariş durumlarını göndermek için kullanılacak yanıt uç noktasını içerir. Yanıt uç noktası, sipariş durumunu istemciye geri göndermek için kuyruğun URI'sini oluşturur. Sipariş işleme uygulaması bu sözleşmeyi uygular.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true)]
    void SubmitPurchaseOrder(PurchaseOrder po, string
                                  reportOrderStatusTo);
}

Sipariş durumunu göndermeye ilişkin yanıt sözleşmesi istemci tarafından belirtilir. İstemci sipariş durumu sözleşmesini uygular. Hizmet, sipariş durumunu istemciye geri göndermek için bu sözleşmenin oluşturulan ara sunucusunu kullanır.

[ServiceContract]
public interface IOrderStatus
{
    [OperationContract(IsOneWay = true)]
    void OrderStatus(string poNumber, string status);
}

Servis işlemi, gönderilen satınalma siparişini işler. , OperationBehaviorAttribute kuyruktan iletiyi almak ve hizmet işlemi tamamlandıktan sonra işlemlerin otomatik tamamlanması için kullanılan bir işlemde otomatik listelemeyi belirtmek için hizmet işlemine uygulanır. sınıfı, Orders sipariş işleme işlevselliğini kapsüller. Bu durumda, satın alma siparişini bir sözlüğe ekler. Hizmet işleminin içinde listelendiği işlem, sınıfındaki Orders işlemler için kullanılabilir.

Hizmet işlemi, gönderilen satın alma siparişinin işlenmesine ek olarak siparişin durumuyla ilgili olarak istemciye geri yanıt verir.

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SubmitPurchaseOrder(PurchaseOrder po, string reportOrderStatusTo)
{
    Orders.Add(po);
    Console.WriteLine("Processing {0} ", po);
    Console.WriteLine("Sending back order status information");
    NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding("ClientCallbackBinding");
    OrderStatusClient client = new OrderStatusClient(msmqCallbackBinding, new EndpointAddress(reportOrderStatusTo));

    // Please note that the same transaction that is used to dequeue the purchase order is used
    // to send back order status.
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
    {
        client.OrderStatus(po.PONumber, po.Status);
        scope.Complete();
    }
    //Close the client.
    client.Close();
}

MSMQ kuyruğu adı, yapılandırma dosyasının bir uygulama Ayarlar bölümünde belirtilir. Hizmetin uç noktası, yapılandırma dosyasının System.ServiceModel bölümünde tanımlanır.

Not

MSMQ kuyruğu adı ve uç nokta adresi biraz farklı adresleme kuralları kullanır. MSMQ kuyruğu adı, yerel makine için nokta (.) ve yolunda ters eğik çizgi ayırıcıları kullanır. Windows Communication Foundation (WCF) uç noktası adresi bir net.msmq: şeması belirtir, yerel makine için "localhost" kullanır ve yolunda eğik çizgi kullanır. Uzak makinede barındırılan bir kuyruktan okumak için "." ve "localhost" sözcüklerini uzak makine adıyla değiştirin.

Hizmet kendi kendine barındırılır. MSMQ aktarımı kullanılırken, kullanılan kuyruk önceden oluşturulmalıdır. Bu, el ile veya kod aracılığıyla yapılabilir. Bu örnekte, hizmet kuyruğun varlığını denetler ve gerekirse oluşturur. Kuyruk adı yapılandırma dosyasından okunur. Temel adres ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) tarafından hizmete proxy oluşturmak için kullanılır.

// Host the service within this EXE console application.
public static void Main()
{
    // Get MSMQ queue name from appSettings in configuration.
    string queueName = ConfigurationManager.AppSettings["queueName"];

    // Create the transacted MSMQ queue if necessary.
    if (!MessageQueue.Exists(queueName))
        MessageQueue.Create(queueName, true);

    // Create a ServiceHost for the OrderProcessorService type.
    using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
    {
        // Open the ServiceHost to create listeners and start listening for messages.
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();
    }
}

İstemci bir işlem oluşturur. Kuyrukla iletişim, işlem kapsamında gerçekleşir ve tüm iletilerin başarılı veya başarısız olduğu atomik bir birim olarak ele alınmasına neden olur.

// Create a ServiceHost for the OrderStatus service type.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderStatusService)))
{

    // Open the ServiceHostBase to create listeners and start listening for order status messages.
    serviceHost.Open();

    // Create the purchase order.
    ...

    // Create a client with given client endpoint configuration.
    OrderProcessorClient client = new OrderProcessorClient("OrderProcessorEndpoint");

    //Create a transaction scope.
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
    {
        string hostName = Dns.GetHostName();

        // Make a queued call to submit the purchase order.
        client.SubmitPurchaseOrder(po, "net.msmq://" + hostName + "/private/ServiceModelSamplesTwo-way/OrderStatus");

        // Complete the transaction.
        scope.Complete();
    }

    //Close down the client.
    client.Close();

    Console.WriteLine();
    Console.WriteLine("Press <ENTER> to terminate client.");
    Console.ReadLine();

    // Close the ServiceHost to shutdown the service.
    serviceHost.Close();
}

İstemci kodu, hizmetten sipariş durumunu almak için sözleşmeyi uygular IOrderStatus . Bu durumda sipariş durumunu yazdırır.

[ServiceBehavior]
public class OrderStatusService : IOrderStatus
{
    [OperationBehavior(TransactionAutoComplete = true,
                        TransactionScopeRequired = true)]
    public void OrderStatus(string poNumber, string status)
    {
        Console.WriteLine("Status of order {0}:{1} ", poNumber ,
                                                           status);
    }
}

Sipariş durumu kuyruğu yönteminde Main oluşturulur. İstemci yapılandırması, aşağıdaki örnek yapılandırmada gösterildiği gibi sipariş durumu hizmetini barındırmak için sipariş durumu hizmet yapılandırmasını içerir.

<appSettings>
  <!-- Use appSetting to configure MSMQ queue name. -->
  <add key="queueName" value=".\private$\ServiceModelSamplesTwo-way/OrderStatus" />
</appSettings>

<system.serviceModel>

  <services>
    <service
       name="Microsoft.ServiceModel.Samples.OrderStatusService">
      <!-- Define NetMsmqEndpoint -->
      <endpoint address="net.msmq://localhost/private/ServiceModelSamplesTwo-way/OrderStatus"
                binding="netMsmqBinding"
                contract="Microsoft.ServiceModel.Samples.IOrderStatus" />
    </service>
  </services>

  <client>
    <!-- Define NetMsmqEndpoint -->
    <endpoint name="OrderProcessorEndpoint"
              address="net.msmq://localhost/private/ServiceModelSamplesTwo-way/OrderProcessor"
              binding="netMsmqBinding"
              contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
  </client>

</system.serviceModel>

Örneği çalıştırdığınızda, istemci ve hizmet etkinlikleri hem hizmet hem de istemci konsol pencerelerinde görüntülenir. Hizmetin istemciden ileti aldığını görebilirsiniz. Hizmeti ve istemciyi kapatmak için her konsol penceresinde ENTER tuşuna basın.

Hizmet, satın alma siparişi bilgilerini görüntüler ve sipariş durumunu sipariş durumu kuyruğuna geri gönderdiğini gösterir.

The service is ready.
Press <ENTER> to terminate service.

Processing Purchase Order: 124a1f69-3699-4b16-9bcc-43147a8756fc
        Customer: somecustomer.com
        OrderDetails
                Order LineItem: 54 of Blue Widget @unit price: $29.99
                Order LineItem: 890 of Red Widget @unit price: $45.89
        Total cost of this order: $42461.56
        Order status: Pending

Sending back order status information

İstemci, hizmet tarafından gönderilen sipariş durumu bilgilerini görüntüler.

Press <ENTER> to terminate client.
Status of order 124a1f69-3699-4b16-9bcc-43147a8756fc:Pending

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

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

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

    Not

    Bu örneğin yapılandırmasını yeniden oluşturmak için Svcutil.exe kullanıyorsanız, istemci yapılandırmasındaki uç nokta adlarını istemci koduyla eşleşecek şekilde değiştirdiğinizden emin olun.

varsayılan olarak , NetMsmqBindingaktarım güvenliği etkindir. MSMQ aktarım güvenliği MsmqAuthenticationMode için iki ilgili özellik vardır ve.MsmqProtectionLevelVarsayılan olarak, kimlik doğrulama modu olarak ve Windows koruma düzeyi olarak Signayarlanır. MSMQ'nun kimlik doğrulama ve imzalama özelliğini sağlaması için bir etki alanının parçası olması ve MSMQ için Active Directory tümleştirme seçeneğinin yüklü olması gerekir. Bu örneği bu ölçütleri karşılamayan bir bilgisayarda çalıştırırsanız bir hata alırsınız.

Örneği bir çalışma grubuna katılmış bir bilgisayarda veya Active Directory tümleştirmesi olmadan çalıştırmak için

  1. Bilgisayarınız bir etki alanının parçası değilse veya Active Directory tümleştirmesi yüklü değilse, aşağıdaki örnek yapılandırmada gösterildiği gibi kimlik doğrulama modunu ve koruma düzeyini None olarak ayarlayarak aktarım güvenliğini kapatın:

    <configuration>
    
      <appSettings>
        <!-- Use appSetting to configure MSMQ queue name. -->
        <add key="queueName" value=".\private$\ServiceModelSamplesTwo-way/OrderProcessor" />
      </appSettings>
    
      <system.serviceModel>
        <services>
          <service
              name="Microsoft.ServiceModel.Samples.OrderProcessorService">
            <!-- Define NetMsmqEndpoint -->
            <endpoint address="net.msmq://localhost/private/ServiceModelSamplesTwo-way/OrderProcessor"
                      binding="netMsmqBinding"
                      bindingConfiguration="TransactedBinding"
                      contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
          </service>
        </services>
    
        <bindings>
          <netMsmqBinding>
            <binding name="TransactedBinding" >
             <security mode="None" />
            </binding>
          </netMsmqBinding>
        </bindings>
    
      </system.serviceModel>
    
    </configuration>
    
  2. İstemci yapılandırması için güvenliğin kapatılması aşağıdakileri oluşturur:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <!-- Use appSetting to configure MSMQ queue name. -->
        <add key="queueName" value=".\private$\ServiceModelSamplesTwo-way/OrderStatus" />
      </appSettings>
    
      <system.serviceModel>
    
        <services>
          <service
             name="Microsoft.ServiceModel.Samples.OrderStatusService">
            <!-- Define NetMsmqEndpoint -->
            <endpoint address="net.msmq://localhost/private/ServiceModelSamplesTwo-way/OrderStatus"
                      binding="netMsmqBinding"
                      bindingConfiguration="TransactedBinding" contract="Microsoft.ServiceModel.Samples.IOrderStatus" />
          </service>
        </services>
    
        <client>
          <!-- Define NetMsmqEndpoint -->
          <endpoint name="OrderProcessorEndpoint"
                    address="net.msmq://localhost/private/ServiceModelSamplesTwo-way/OrderProcessor"
                    binding="netMsmqBinding"
                    bindingConfiguration="TransactedBinding"
                    contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
        </client>
    
        <bindings>
          <netMsmqBinding>
            <binding name="TransactedBinding" >
             <security mode="None" />
            </binding>
          </netMsmqBinding>
        </bindings>
    
      </system.serviceModel>
    
    </configuration>
    
  3. Bu örneğin hizmeti içinde OrderProcessorServicebir bağlama oluşturur. Güvenlik modunu Noneolarak ayarlamak için bağlama örneği eklendikten sonra bir kod satırı ekleyin.

    NetMsmqBinding msmqCallbackBinding = new NetMsmqBinding();
    msmqCallbackBinding.Security.Mode = NetMsmqSecurityMode.None;
    
  4. Örneği çalıştırmadan önce hem sunucuda hem de istemcide yapılandırmayı değiştirdiğinizden emin olun.

    Not

    ayarı security mode , MsmqProtectionLevel veya Message güvenliği olarak ayarlamakla MsmqAuthenticationModeNoneeşdeğerdir.None