Aracılığıyla paylaş


İşlem Gerçekleştirilmiş 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.

Not

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 hizmet ve alıcı kuyruk yöneticisi için yereldir. 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ışı, olarak ayarlanmış truebir işlem davranışını TransactionScopeRequired tanımlar. Bu, kuyruktan ileti almak için kullanılan işlem kapsamının yöntemi tarafından erişilen tüm kaynak yöneticileri tarafından kullanılmasını sağlar. Ayrıca yöntem bir özel durum oluşturursa 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 işler; 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 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ı 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 uygulama Ayarlar bölümünde belirtilir.

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

Not

Kuyruk adı, kullanarak kuyruk oluştururken yerel bilgisayar için nokta (.) ve yolunda ters eğik çizgi ayırıcıları kullanır System.Messaging. Windows Communication Foundation (WCF) uç noktası, net.msmq düzeniyle kuyruk adresini kullanır, yerel bilgisayarı belirtmek için "localhost" kullanır ve yolunda eğik çizgi 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 çağrılarak Complete işlenir.

// 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çin Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Hizmet önce çalıştırılırsa kuyruğun mevcut olduğundan emin olmak için denetler. Kuyruk yoksa, hizmet bir kuyruk oluşturur. 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 açın.

    2. Özellikler sekmesini genişletin.

    3. Özel İleti Kuyrukları'ne sağ tıklayın ve Yeni, Özel Kuyruk'a tıklayın.

    4. İşlem kutusunu işaretleyin.

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

  3. Çö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.

  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 , NetMsmqBindingaktarım güvenliği etkindir. MSMQ aktarım güvenliği MsmqAuthenticationMode için iki ilgili özellik vardır ve MsmqProtectionLevel. Varsayılan olarak, kimlik doğrulama modu olarak ve Windows koruma düzeyi olarak ayarlanır Sign. 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.

    Not

    ayarı security modeNone, , MsmqProtectionLevelve Message güvenliğini olarak ayarlamakla MsmqAuthenticationModeNoneeşdeğerdir.