Message Queuing untuk Windows Communication Foundation
Sampel MsmqToWcf menunjukkan cara aplikasi Message Queuing (MSMQ) dapat mengirim pesan MSMQ ke layanan Windows Communication Foundation (WCF). Layanan ini adalah aplikasi konsol yang dihosting sendiri untuk memungkinkan Anda mengamati layanan yang menerima pesan antrean.
Kontrak layanan adalah IOrderProcessor
, yang menentukan layanan satu arah yang cocok untuk digunakan dengan antrean. Pesan MSMQ tidak memiliki header Tindakan, sehingga tidak mungkin untuk memetakan pesan MSMQ yang berbeda ke kontrak operasi secara otomatis. Oleh karena itu, hanya ada satu kontrak operasi. Jika Anda ingin menentukan lebih dari satu kontrak operasi untuk layanan, aplikasi harus memberikan informasi tentang header mana dalam pesan MSMQ (misalnya, label atau correlationID) yang dapat digunakan untuk memutuskan kontrak operasi yang akan dikirim.
Pesan MSMQ tidak berisi informasi tentang header yang dipetakan ke parameter kontrak operasi yang berbeda. Parameter berjenis MsmqMessage<T>(MsmqMessage<T>
), yang berisi pesan MSMQ yang mendasar. Jenis "T" di kelas MsmqMessage<T>(MsmqMessage<T>
) mewakili data yang diserialisasikan ke dalam isi pesan MSMQ. Dalam sampel ini, jenis PurchaseOrder
diserialisasikan ke dalam isi pesan MSMQ.
Sampel kode berikut menunjukkan kontrak layanan dari layanan pemrosesan pesanan.
// 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);
}
Layanan ini dihost sendiri. Saat menggunakan MSMQ, antrean yang digunakan harus dibuat terlebih dahulu. Ini dapat dilakukan secara manual atau melalui kode. Dalam sampel, layanan ini memeriksa keberadaan antrean dan membuatnya jika diperlukan. Nama antrean dibaca dari file konfigurasi.
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);
…
}
Layanan membuat dan membuka ServiceHost untuk OrderProcessorService
, seperti yang ditunjukkan dalam kode sampel berikut.
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();
}
Nama antrean MSMQ ditentukan di bagian appSettings dari file konfigurasi, seperti yang ditunjukkan dalam konfigurasi sampel berikut.
Catatan
Nama antrean menggunakan titik (.) untuk komputer lokal dan pemisah garis miring terbalik di jalurnya. Alamat titik akhir WCF menentukan skema msmq.formatname, dan menggunakan localhost untuk komputer lokal. Alamat antrean untuk setiap pedoman alamat Nama Format MSMQ mengikuti skema msmq.formatname.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Aplikasi klien adalah aplikasi MSMQ yang menggunakan metode Send untuk mengirim pesan operasional dan transaksional ke antrean, seperti yang ditunjukkan dalam kode sampel berikut.
//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();
Saat Anda menjalankan sampel, aktivitas klien dan layanan ditampilkan baik di jendela konsol layanan dan klien. Anda dapat melihat layanan menerima pesan dari klien. Tekan ENTER di setiap jendela konsol untuk mematikan layanan dan klien. Perhatikan bahwa karena antrean sedang digunakan, klien dan layanan tidak harus aktif dan dijalankan pada saat yang sama. Misalnya, Anda dapat menjalankan klien, mematikannya, lalu memulai layanan dan masih akan menerima pesan klien.
Menyiapkan, membangun, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.
Jika layanan dijalankan terlebih dahulu, layanan akan memeriksa untuk memastikan bahwa antrean ada. Jika antrean tidak ada, layanan akan membuatnya. Anda dapat menjalankan layanan terlebih dahulu untuk membuat antrean, atau Anda dapat membuatnya melalui Pengelola Antrean MSMQ. Ikuti langkah-langkah ini untuk membuat antrean di Windows 2008.
Buka Pengelola Server di Visual Studio 2012.
Luaskan tab Fitur.
Klik kanan Antrean Pesan Privat, dan pilih Baru, Antrean Privat.
Centang kotak Transaksional.
Masukkan
ServiceModelSamplesTransacted
sebagai nama antrean baru.
Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.
Untuk menjalankan sampel dalam konfigurasi komputer tunggal, ikuti instruksi dalam Menjalankan Sampel WCF.
Menjalankan sampel di seluruh komputer
Salin file program layanan dari folder \service\bin\, di bawah folder khusus bahasa, ke komputer layanan.
Salin file program klien dari folder \client\bin\, di bawah folder khusus bahasa, ke komputer klien.
Dalam file Client.exe.config, ubah orderQueueName untuk menentukan nama komputer layanan sebagai ganti ".".
Di komputer layanan, luncurkan Service.exe dari perintah.
Di komputer klien, luncurkan Client.exe dari perintah.