Windows Communication Foundation'a İleti Kuyruğa Alma

MsmqToWcf örneği, Message Queuing (MSMQ) uygulamasının Windows Communication Foundation (WCF) hizmetine nasıl MSMQ iletisi gönderebileceğini gösterir. Hizmet, kuyruğa alınmış iletileri alan hizmeti gözlemlemenizi sağlayan şirket içinde barındırılan bir konsol uygulamasıdır.

Hizmet sözleşmesi, IOrderProcessorkuyruklarla kullanıma uygun tek yönlü bir hizmeti tanımlayan şeklindedir. MSMQ iletisinin Eylem üst bilgisi yoktur, bu nedenle farklı MSMQ iletilerini sözleşmeleri otomatik olarak işleyebilmek için eşlemek mümkün değildir. Bu nedenle, yalnızca bir işlem sözleşmesi olabilir. Hizmet için birden fazla işlem sözleşmesi tanımlamak istiyorsanız, uygulamanın HANGI işlem sözleşmesinin gönderileceğine karar vermek için MSMQ iletisindeki hangi üst bilginin (örneğin, etiket veya bağıntı KIMLIĞI) kullanılabileceğini gösteren bilgiler sağlaması gerekir.

MSMQ iletisi, üst bilgilerin işlem sözleşmesinin farklı parametrelerine eşlendiği bilgiler içermez. parametresi, temel alınan MSMQ iletisini içeren ()MsmqMessage<T> türündedirMsmqMessage<T>. (MsmqMessage<T>) sınıfındaki MsmqMessage<T>"T" türü MSMQ ileti gövdesinde seri hale getirilmiş verileri temsil eder. Bu örnekte, PurchaseOrder tür MSMQ ileti gövdesinde serileştirilir.

Aşağıdaki örnek kod, sipariş işleme hizmetinin hizmet sözleşmesini gösterir.

// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}

Hizmet kendi kendine barındırılır. MSMQ 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.

public static void Main()
{
    // Get the MSMQ queue name from the application settings in
    // configuration.
    string queueName = ConfigurationManager.AppSettings["queueName"];
    // Create the MSMQ queue if necessary.
    if (!MessageQueue.Exists(queueName))
        MessageQueue.Create(queueName, true);
    …
}

Hizmet, aşağıdaki örnek kodda gösterildiği gibi için OrderProcessorServicebir ServiceHost oluşturur ve açar.

using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
    serviceHost.Open();
    Console.WriteLine("The service is ready.");
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
    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.

Not

Kuyruk adı, yerel bilgisayar için nokta (.) ve yolunda ters eğik çizgi ayırıcıları kullanır. WCF uç noktası adresi bir msmq.formatname şeması belirtir ve yerel bilgisayar için localhost kullanır. Her MSMQ Biçim Adı adresleme yönergeleri için kuyruğun adresi msmq.formatname düzenini izler.

<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</appSettings>

İstemci uygulaması, aşağıdaki örnek kodda Send gösterildiği gibi kuyruğa dayanıklı ve işlemsel bir ileti göndermek için yöntemini kullanan bir MSMQ uygulamasıdır.

//Connect to the queue.
MessageQueue orderQueue = new MessageQueue(ConfigurationManager.AppSettings["orderQueueName"]);

// 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;

// Submit the purchase order.
Message msg = new Message();
msg.Body = po;
//Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{

    orderQueue.Send(msg, MessageQueueTransactionType.Automatic);
    // Complete the transaction.
    scope.Complete();

}
Console.WriteLine("Placed the order:{0}", po);
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

Ö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. Örneğin, istemciyi çalıştırabilir, kapatabilir ve ardından hizmeti başlatabilir ve yine de iletilerini alabilirsiniz.

Örneği ayarlama, derleme ve çalıştırma

  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 bilgisayarlı bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.

Örneği bilgisayarlar arasında çalıştırma

  1. \service\bin\ klasöründeki, dile özgü klasörün altındaki hizmet programı dosyalarını hizmet bilgisayarına kopyalayın.

  2. \client\bin\ klasöründeki, dile özgü klasörün altındaki istemci program dosyalarını istemci bilgisayara kopyalayın.

  3. Client.exe.config dosyasında orderQueueName değerini değiştirerek "." yerine hizmet bilgisayarı adını belirtin.

  4. Hizmet bilgisayarında bir komut isteminden Service.exe başlatın.

  5. İstemci bilgisayarda bir komut isteminden Client.exe başlatın.

Ayrıca bkz.