Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sampel MsmqToWcf menunjukkan bagaimana aplikasi Message Queuing (MSMQ) dapat mengirim pesan MSMQ ke layanan Windows Communication Foundation (WCF). Layanan ini adalah aplikasi konsol yang dihost sendiri untuk memungkinkan Anda mengamati layanan yang menerima pesan antrean.
Kontrak layanan adalah IOrderProcessor
, yang mendefinisikan 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) dapat digunakan untuk memutuskan kontrak operasi mana yang akan dikirim.
Pesan MSMQ tidak berisi informasi tentang header mana yang dipetakan ke parameter yang berbeda dari kontrak operasi. Parameter berjenis MsmqMessage<T>(MsmqMessage<T>
), yang berisi pesan MSMQ yang mendasar. Jenis "T" di MsmqMessage<T>kelas (MsmqMessage<T>
) mewakili data yang diserialisasikan ke dalam isi pesan MSMQ. Dalam sampel ini, tipe PurchaseOrder
diserialkan ke dalam isi pesan MSMQ.
Kode sampel berikut menunjukkan kontrak layanan 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 ini, layanan 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.
Nota
Nama antrean menggunakan titik (.) untuk komputer lokal dan garis miring terbalik sebagai pemisah di jalurnya. Alamat titik akhir WCF menentukan skema msmq.formatname, dan menggunakan localhost untuk komputer lokal. Alamat antrean untuk setiap panduan alamat Nama Format MSMQ mengikuti skema msmq.formatname yang telah ditentukan.
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
Aplikasi klien adalah aplikasi MSMQ yang menggunakan Send metode untuk mengirim pesan tahan lama dan transaksi 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 di jendela layanan dan konsol klien. Anda dapat melihat layanan menerima pesan dari klien. Tekan ENTER di setiap jendela konsol untuk mematikan layanan dan klien. Perhatikan bahwa karena antrean digunakan, klien dan layanan tidak perlu berfungsi secara bersamaan. Misalnya, Anda dapat menjalankan klien, mematikannya, lalu memulai layanan dan masih akan menerima pesannya.
Menyiapkan, membangun, dan menjalankan sampel
Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.
Jika layanan dijalankan terlebih dahulu, layanan akan memeriksa untuk memastikan bahwa antrean ada. Jika antrean belum ada, layanan akan membuatnya. Anda dapat menjalankan layanan terlebih dahulu untuk membuat antrean, atau Anda dapat membuatnya melalui MSMQ Queue Manager. Ikuti langkah-langkah ini untuk membuat antrean di Windows 2008.
Buka Manajer Server di Visual Studio 2012.
Perluas tab Fitur.
Klik kanan Antrean Pesan Privat, dan pilih Baru, Antrean Privat.
Centang kotak Transaksi.
Masukkan
ServiceModelSamplesTransacted
sebagai nama antrean baru.
Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti instruksi di Membangun Sampel Windows Communication Foundation.
Untuk menjalankan sampel dalam konfigurasi komputer tunggal, ikuti instruksi dalam Menjalankan Sampel Windows Communication Foundation.
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, bukan ".".
Di komputer server, luncurkan Service.exe dari prompt perintah.
Di komputer klien, jalankan Client.exe dari jendela perintah.