Bagikan melalui


Windows Communication Foundation ke Message Queuing

Sampel WcfToMsmq menunjukkan bagaimana aplikasi Windows Communication Foundation (WCF) dapat mengirim pesan ke aplikasi Message Queuing (MSMQ). Layanan ini adalah aplikasi konsol yang dihosting sendiri untuk memungkinkan Anda mengamati layanan yang menerima pesan antrean. Layanan dan klien tidak harus berjalan pada saat yang sama.

Layanan menerima pesan dari antrean dan memproses pesanan. Layanan ini membuat antrean transaksional dan menyiapkan penangan pesan yang diterima, seperti yang ditunjukkan pada kode sampel berikut.

static void Main(string[] args)
{
    if (!MessageQueue.Exists(
              ConfigurationManager.AppSettings["queueName"]))
       MessageQueue.Create(
           ConfigurationManager.AppSettings["queueName"], true);
        //Connect to the queue
        MessageQueue Queue = new
    MessageQueue(ConfigurationManager.AppSettings["queueName"]);
    Queue.ReceiveCompleted +=
                 new ReceiveCompletedEventHandler(ProcessOrder);
    Queue.BeginReceive();
    Console.WriteLine("Order Service is running");
    Console.ReadLine();
}

Saat pesan diterima dalam antrean, penangan pesan ProcessOrder dipanggil.

public static void ProcessOrder(Object source,
    ReceiveCompletedEventArgs asyncResult)
{
    try
    {
        // Connect to the queue.
        MessageQueue Queue = (MessageQueue)source;
        // End the asynchronous receive operation.
        System.Messaging.Message msg =
                     Queue.EndReceive(asyncResult.AsyncResult);
        msg.Formatter = new System.Messaging.XmlMessageFormatter(
                                new Type[] { typeof(PurchaseOrder) });
        PurchaseOrder po = (PurchaseOrder) msg.Body;
        Random statusIndexer = new Random();
        po.Status = PurchaseOrder.OrderStates[statusIndexer.Next(3)];
        Console.WriteLine("Processing {0} ", po);
        Queue.BeginReceive();
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

}

Layanan mengekstrak ProcessOrder dari isi pesan MSMQ, dan memproses pesanan.

Nama antrean MSMQ ditentukan di bagian appSettings dari file konfigurasi, seperti yang ditunjukkan dalam konfigurasi sampel berikut.

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

Catatan

Nama antrean menggunakan titik (.) untuk komputer lokal dan pemisah garis miring terbalik di jalurnya.

Klien membuat pesanan pembelian dan mengirimkan pesanan pembelian dalam lingkup transaksi, seperti yang ditunjukkan dalam kode sampel berikut.

// Create the purchase order
PurchaseOrder po = new PurchaseOrder();
// Fill in the details
...

OrderProcessorClient client = new OrderProcessorClient("OrderResponseEndpoint");

MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    client.SubmitPurchaseOrder(ordermsg);
    scope.Complete();
}
Console.WriteLine("Order has been submitted:{0}", po);

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

Klien menggunakan klien kustom untuk mengirim pesan MSMQ ke antrean. Karena aplikasi yang menerima dan memproses pesan adalah aplikasi MSMQ dan bukan aplikasi WCF, tidak ada kontrak layanan implisit antara kedua aplikasi. Jadi, kami tidak dapat membuat proksi menggunakan alat Svcutil.exe dalam skenario ini.

Proksi kustom pada dasarnya sama untuk semua aplikasi WCF yang menggunakan pengikatan MsmqIntegration untuk mengirim pesan. Tidak seperti klien lain, itu tidak termasuk berbagai operasi layanan. Ini hanya operasi kirim pesan.

[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}

public partial class OrderProcessorClient : System.ServiceModel.ClientBase<IOrderProcessor>, IOrderProcessor
{
    public OrderProcessorClient(){}

    public OrderProcessorClient(string configurationName)
        : base(configurationName)
    { }

    public OrderProcessorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress address)
        : base(binding, address)
    { }

    public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg)
    {
        base.Channel.SubmitPurchaseOrder(msg);
    }
}

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.

Catatan

Sampel ini membutuhkan penginstalan Message Queuing. Lihat instruksi penginstalan di Message Queuing.

Menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. 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.

    1. Buka Pengelola Server di Visual Studio 2012.

    2. Luaskan tab Fitur.

    3. Klik kanan Antrean Pesan Privat, dan pilih Baru>Antrean Privat.

    4. Centang kotak Transaksional.

    5. Masukkan ServiceModelSamplesTransacted sebagai nama antrean baru.

  3. Untuk membangun solusi edisi C# atau Visual Basic, ikuti petunjuknya di Membangun Sampel Windows Communication Foundation.

  4. Untuk menjalankan sampel dalam konfigurasi komputer tunggal, ikuti instruksi dalam Menjalankan Sampel Windows Communication Foundation.

Menjalankan sampel di seluruh komputer

  1. Salin file program layanan dari folder \service\bin\, di bawah folder khusus bahasa, ke komputer layanan.

  2. Salin file program klien dari folder \client\bin\, di bawah folder khusus bahasa, ke komputer klien.

  3. Dalam file Client.exe.config, ubah titik akhir untuk menentukan nama komputer layanan alih-alih ".".

  4. Di komputer layanan, luncurkan Service.exe dari perintah.

  5. Di komputer klien, luncurkan Client.exe dari perintah.

Lihat juga