Aracılığıyla paylaş


İşlem Yapılan MSMQ Bağlama

İşlem Yapılan örnek, Message Queuing (MSMQ) kullanarak işlem yapılmış kuyruğa alınmış iletişimin nasıl gerçekleştirileceklerini gösterir.

Uyarı

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

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

İşlemler ileti göndermek ve almak için kullanıldığında aslında iki ayrı işlem vardır. İstemci bir işlem kapsamında ileti gönderdiğinde, işlem istemci ve istemci kuyruk yöneticisi için yereldir. Hizmet, işlem kapsamında iletiler aldığında, işlem hizmete ve alıcı kuyruk yöneticisine özeldir. müşterinin ve hizmetin aynı işleme katılmadığını hatırlamak çok önemlidir; bunun yerine, kuyrukla işlemlerini gerçekleştirirken (gönderme ve alma gibi) farklı işlemler kullanıyorlar.

Bu örnekte istemci, bir işlem kapsamından hizmete bir toplu ileti gönderir. Ardından kuyruğa gönderilen iletiler hizmet tarafından tanımlanan işlem kapsamında alınır.

Hizmet sözleşmesi, aşağıdaki örnek kodda gösterildiği gibi şeklindedir IOrderProcessor. Arabirim, kuyruklarla kullanıma uygun tek yönlü bir hizmet tanımlar.

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

Hizmet davranışı, TransactionScopeRequired olarak ayarlanmış true bir işlem davranışını tanımlar. Bu, kuyruktan ileti almak için kullanılan aynı işlem kapsamının, yöntem tarafından erişilen tüm kaynak yöneticileri tarafından da kullanılmasını sağlar. Ayrıca yöntem bir hata fırlatırsa, iletinin kuyruğa döndürüldüğünü de garanti eder. Bu işlem davranışını ayarlamadan, kuyruğa alınan bir kanal, kuyruktan iletiyi okumak için bir işlem oluşturur ve göndermeden önce otomatik olarak onaylar; böylece, işlem başarısız olursa ileti kaybolur. En yaygın senaryo, hizmet işlemlerinin aşağıdaki kodda gösterildiği gibi kuyruktan iletiyi okumak için kullanılan işleme kaydolmasıdır.

 // This service class that implements the service contract.
 // This added code writes output to the console window.
public class OrderProcessorService : IOrderProcessor
 {
     [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
     public void SubmitPurchaseOrder(PurchaseOrder po)
     {
         Orders.Add(po);
         Console.WriteLine("Processing {0} ", po);
     }
  …
}

Hizmet kendi sunucunuzda 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ı denetlemek ve yoksa kuyruğu oluşturmak için kod içerir. 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 the 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();

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

MSMQ kuyruğu adı, aşağıdaki örnek yapılandırmada gösterildiği gibi yapılandırma dosyasının appSettings bölümünde belirtilir.

<appSettings>
    <add key="queueName" value=".\private$\ServiceModelSamplesTransacted" />
</appSettings>

Uyarı

Kuyruk oluştururken, yerel bilgisayar için kuyruk adı olarak nokta (.) ve yolunda ters eğik çizgi ayırıcılarını, System.Messaging kullanarak uygular. Windows Communication Foundation (WCF) uç noktası, net.msmq düzeniyle kuyruk adresini kullanır, yerel bilgisayarı belirtmek için "localhost" kullanır ve yolunda ileri eğik çizgiler kullanır.

İstemci bir işlem kapsamı oluşturur. Kuyrukla iletişim, işlem kapsamında gerçekleşir ve tüm iletilerin kuyruğa gönderildiği veya iletilerden hiçbirinin kuyruğa gönderilmediği atomik birim olarak ele alınmasına neden olur. İşlem, işlem kapsamında Complete çağrılarak taahhüt edilir.

// Create a client.
OrderProcessorClient client = new OrderProcessorClient();

// Create the purchase order.
PurchaseOrder po = new PurchaseOrder();
po.CustomerId = "somecustomer.com";
po.PONumber = Guid.NewGuid().ToString();

PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
lineItem1.ProductId = "Blue Widget";
lineItem1.Quantity = 54;
lineItem1.UnitCost = 29.99F;

PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
lineItem2.ProductId = "Red Widget";
lineItem2.Quantity = 890;
lineItem2.UnitCost = 45.89F;

po.orderLineItems = new PurchaseOrderLineItem[2];
po.orderLineItems[0] = lineItem1;
po.orderLineItems[1] = lineItem2;

// Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    // Make a queued call to submit the purchase order.
    client.SubmitPurchaseOrder(po);
    // Complete the transaction.
    scope.Complete();
}

// Closing the client gracefully closes the connection and cleans up resources.
client.Close();

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

İşlemlerin çalıştığını doğrulamak için, aşağıdaki örnek kodda gösterildiği gibi işlem kapsamına açıklama ekleyerek istemciyi değiştirin, çözümü yeniden derleyin ve istemciyi çalıştırın.

//scope.Complete();

İşlem tamamlanmadığından iletiler kuyruğa gönderilmez.

Ö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. Kuyruğa alma kullanımda olduğundan istemcinin ve hizmetin aynı anda çalışır durumda olması gerekmediğini unutmayın. İstemciyi çalıştırabilir, kapatabilir, ardından hizmeti başlatabilir ve iletileri almaya devam edebilirsiniz.

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

Processing Purchase Order: 7b31ce51-ae7c-4def-9b8b-617e4288eafd
        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

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

  1. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  2. Hizmet önce çalıştırılırsa, kuyruğun mevcut olup olmadığını kontrol eder. Kuyruk mevcut değilse, hizmet tarafından bir kuyruk oluşturulacaktır. Kuyruğu oluşturmak için önce hizmeti çalıştırabilir veya MSMQ Kuyruk Yöneticisi aracılığıyla bir kuyruk oluşturabilirsiniz. Windows 2008'de kuyruk oluşturmak için bu adımları izleyin.

    1. Visual Studio 2012'de Sunucu Yöneticisi'nin açılması.

    2. Özellikler sekmesini genişletin.

    3. Özel İleti Kuyruklarısağ tıklayın ve Yeni, Özel Kuyrukseçin.

    4. İşlem kutusunu işaretleyin.

    5. Yeni kuyruğun adı olarak ServiceModelSamplesTransacted girin.

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

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

varsayılan olarak, NetMsmqBinding aktarım güvenliği etkindir. MSMQ aktarım güvenliğine ilişkin iki ilgili özellik, MsmqAuthenticationMode ve MsmqProtectionLevel'dir. Varsayılan olarak, kimlik doğrulama modu Windows ve koruma düzeyi Sign olarak ayarlanı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ırma kodunda gösterildiği gibi kimlik doğrulama modunu ve koruma düzeyini None olarak ayarlayarak aktarım güvenliğini kapatın.

    <system.serviceModel>
      <services>
        <service name="Microsoft.ServiceModel.Samples.OrderProcessorService"
                 behaviorConfiguration="OrderProcessorServiceBehavior">
          <host>
            <baseAddresses>
              <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
            </baseAddresses>
          </host>
          <!-- Define NetMsmqEndpoint. -->
          <endpoint
              address="net.msmq://localhost/private/ServiceModelSamplesTransacted"
              binding="netMsmqBinding"
              bindingConfiguration="Binding1"
           contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
          <!-- The mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex. -->
          <endpoint address="mex"
                    binding="mexHttpBinding"
                    contract="IMetadataExchange" />
        </service>
      </services>
    
      <bindings>
        <netMsmqBinding>
          <binding name="Binding1">
            <security mode="None" />
          </binding>
        </netMsmqBinding>
      </bindings>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="OrderProcessorServiceBehavior">
              <serviceMetadata httpGetEnabled="True"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
      </system.serviceModel>
    
  2. Örneği çalıştırmadan önce hem sunucuda hem de istemcide yapılandırmayı değiştirdiğinizden emin olun.

    Uyarı

    Ayarı security modeNone, MsmqAuthenticationMode, MsmqProtectionLevel ve Message güvenliğini None olarak ayarlamakla eşdeğerdir.