Aracılığıyla paylaş


Microsoft Message Queuing'e yazmak ve okumak için Visual C# kullanma

Bu makalede, Visual C# içinde Microsoft Message Queuing'e (MSMQ) yazma ve okuma işlemleri açıklanmaktadır.

Özgün ürün sürümü: Microsoft Message Queuing
Özgün KB numarası: 815811

Bu görevde

Özet

Bu makalede aşağıdakiler açıklanmaktadır:

  • Windows uygulamasında ileti oluşturma ve MSMQ'ya gönderme.
  • Özel bir kuyruktan nasıl okunur ve mesaj içeriği görüntülenmek üzere nasıl seri hale getirilir.

Gereksinimler

Aşağıdaki öğeler önerilen donanım, yazılım, ağ altyapısı, beceri ve bilgi ile gerekli hizmet paketlerini açıklar:

  • MSMQ yüklü aşağıdaki işletim sistemlerinden biri (dört işletim sisteminde bir seçenek olarak bulunur): Windows 2000 Professional (veya Server) veya Windows XP Professional (veya Server).

Bu makalede ayrıca aşağıdakilere aşina olduğunuz varsayılır:

  • MSMQ
  • Komut istemindeki araçları kullanma

başa dön

MSMQ'ya yazma ve MSMQ'dan okuma

.NET Framework içindeki System.Messaging namespace, MSMQ'dan okuma ve MSMQ'ya yazma işlemlerini gerçekleştirmek için gereken sınıfları içerir. Çevrimiçi fatura ödeme sistemini taklit eden küçük bir Windows uygulaması oluşturmak için şu adımları izleyin:

  1. Visual Studio .NET veya Visual Studio 2005'i açın.

  2. Visual C# içinde yeni bir Windows uygulaması oluşturun ve msmq olarak adlandırın.

  3. Çözüm Gezgini görüntülenmiyorsa görüntülemek için CTRL+ALT+L tuşlarına basın. Çözüm Gezgini'da Başvurular'a sağ tıklayın ve ardından Başvuru Ekle'ye tıklayın.

  4. .NET sekmesinde, .dll dosyaları listesinden System.Messaging.dll dosyasını seçin. Seç'e ve ardından Tamam'a tıklayın.

    Not

    Visual Studio 2005'te, DLL listesindeki System.Messaging.dll dosyasına tıklayın ve ardından Tamam'a tıklayın.

  5. Form1.cs Tasarım görünümünde açıktır. Açık değilse, Çözüm Gezgini içindeki Form1.cs dosyasına çift tıklayın.

  6. Araç kutusunu açmak için CTRL+ALT+X tuşlarına basın. Araç Kutusu'nda Windows Forms sekmesine tıklayın.

  7. Araç Kutusu'ndan aşağıdakileri Form1'in ortasına sürükleyin:

    • Bir Etiket ve Metin Kutusu'nun her biri için dört satır (her etiketin sağındaki konuma konumlandırılır).
    • Etiketlerin ve metin kutularının altında, iki Düğme denetimini Form1'e sürükleyin.
  8. Denetimlere sağ tıklayın, Özellikler'e tıklayın ve etiketler için Text özelliğini şu şekilde ayarlayın (sırayla):

    • Ödeme Adresi:
    • Adınız:
    • Miktar:
    • Son Tarih:
  9. Özellikler iletişim kutusunda, button1'in Text özelliğini Send Payment olarak ve button2'nin Text özelliğini Process Payment olarak ayarlayın.

  10. Bu uygulama, önce Bilgisayar Yönetimi konsolunda oluşturmanız gereken özel bir kuyrukla çalışır. Bunun için aşağıdaki adımları izleyin:

    1. Masaüstünde Bilgisayarım'a sağ tıklayın ve ardından Yönet'e tıklayın.
    2. MSMQ'yu bulmak için Hizmetler ve Uygulamalar düğümünü genişletin.

    Not

    MSMQ'yu bulamazsanız yüklü değildir.

  11. Message Queuing'i genişletin, Özel Kuyruklar'a sağ tıklayın, Yeni'nin üzerine gelin ve ardından Özel Kuyruk'a tıklayın.

  12. Kuyruk adı kutusuna billpay yazın ve Tamam'a tıklayın.

    Not

    İşlemsel onay kutusunu seçmeyin. İletileri görüntülemek için daha sonra geri döndüğünüz için Bilgisayar Yönetimi konsolunu açık bırakın.

  13. Form1'deki kodun en üstüne, ad alanında ve USING ad alanında bulunan ek sınıfları dahil etmek için sınıf bildiriminden System.Messaging önce iki System.Text deyim ekleyin. (System.Text ad alanı, dizeleri birleştirirken en iyi şekilde kullanılabilecek yeni bir .NET Framework sınıfı olan StringBuilder sınıfının kullanımına yöneliktir.)

    using System.Messaging;
    using System.Text;
    
  14. Ödeme tanımlayan verileri barındırmak için değişkenler içeren bir yapı oluşturun. Yapıyı oluşturmak için Main yordamından sonra aşağıdaki kodu ekleyin:

    public struct Payment
    {
        public string Payor,Payee;
        public int Amount;
        public string DueDate;
    }
    
  15. Aşağıdaki adımlarda yer alan kodu, Click'nin button1 olayına ekleyin.

    1. Yapı özelliklerini form öğelerinin değerlerine aşağıdaki gibi ayarlayın:

      Payment myPayment;
      myPayment.Payor = textBox1.Text;
      myPayment.Payee = textBox2.Text;
      myPayment.Amount = Convert.ToInt32(textBox3.Text);
      myPayment.DueDate = textBox4.Text;
      
    2. Bir Message sınıfı örneği oluşturun ve ardından Body özelliğini payment yapısına ayarlayın.

      System.Messaging.Message msg = new System.Messaging.Message();
      msg.Body=myPayment;
      
    3. MSMQ'ya ileti göndermek için, bir sınıf örneği olan MessageQueue oluşturun ve Send nesnesini ileten Message yöntemini çağırın. sınıfı, MessageQueue MSMQ ile etkileşimi yöneten sarmalayıcıdır.

      Not

      Bilgisayar Yönetimi konsolunda oluşturduğunuz özel kuyruğun yolunu ayarlamak için söz dizimi. Özel kuyruklar machinename\Private$\queuename şeklini alır. Yerel konak makinelerine bir nokta (bu . olarak gösterilir) ile başvurulur.

      MessageQueue msgQ =new MessageQueue(".\\Private$\\billpay");
      msgQ.Send(msg);
      

      Kod artık MSMQ'ya ileti göndermek için var. .NET Framework, bir XMLMessageFormatter nesne kullanarak iletiyi otomatik olarak serileştirir. İletiler gönderildiğinde bu nesne örtük olarak oluşturulur.

  16. Aşağıdaki adımlarda yer alan kodu button2 olayına Click ekleyin. Olay işleyicisi, button2_Click olay işleyicisinde button1 gönderilen ödeme iletisini alır ve işler.

    1. İlk kod satırı, ilk olay işleyicisindeki kod satırıyla aynıdır:

      MessageQueue msgQ = new MessageQueue(".\\Private$\\billpay");
      
    2. XMLMessageFormatter sınıfına geçirmek için bir tip dizisi oluşturun.

      Not

      İletiler alınırken bu sınıf açıkça oluşturulmalıdır. sınıfının oluşturucu, XMLMessageFormatter tür adlarından oluşan bir dize dizisi veya daha tercihen bir Type tür dizisi alır:

      Payment myPayment=new Payment();
      Object o=new Object();
      System.Type[] arrTypes=new System.Type [2];
      arrTypes[0] = myPayment.GetType();
      arrTypes[1] = o.GetType();
      msgQ.Formatter = new XmlMessageFormatter(arrTypes);
      myPayment=((Payment)msgQ.Receive().Body);
      

      Bu türler, XMLMessageFormatter iletiyi seri durumdan çıkarma işlemini belirler.

    3. Receive yöntemi çağrılarak iletiler alınır. Body İleti içeriğini okumak için özelliğine erişin. Body özelliği bir nesne döndürür, bu nedenle içeriğin kullanılabilir bir biçimde alınması için nesnenin ödeme türüne atanmış olması gerekir:

      StringBuilder sb = new StringBuilder();
      sb.Append("Payment paid to: " + myPayment.Payor);
      sb.Append("\n");
      sb.Append("Paid by: " + myPayment.Payee);
      sb.Append("\n");
      sb.Append("Amount: $" + myPayment.Amount.ToString());
      sb.Append("\n");
      sb.Append("Due Date: " + Convert.ToDateTime(myPayment.DueDate));
      
    4. Sonuçları görüntülemek için bir ileti kutusu oluşturun:

      MessageBox.Show(sb.ToString(), "Message Received!");
      

başa dön

Tam kod listesi (Form1.cs)

using System.Messaging;
using System.Text;
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApplication1
{
/// <summary>
/// Summary description for Form1.
/// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Label label4;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.TextBox textBox2;
        private System.Windows.Forms.TextBox textBox3;
        private System.Windows.Forms.TextBox textBox4;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;
        public Form1()
        {
        // Required for Windows Form Designer support
            InitializeComponent();
        // TODO: Add any constructor code after InitializeComponent call
        }
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.label2 = new System.Windows.Forms.Label();
            this.label3 = new System.Windows.Forms.Label();
            this.label4 = new System.Windows.Forms.Label();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.textBox3 = new System.Windows.Forms.TextBox();
            this.textBox4 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // label1
            this.label1.Location = new System.Drawing.Point(8, 24);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(104, 32);
            this.label1.TabIndex = 0;
            this.label1.Text = "Pay To:";
            // label2
            this.label2.Location = new System.Drawing.Point(8, 80);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(104, 32);
            this.label2.TabIndex = 1;
            this.label2.Text = "Your Name:";
            // label3
            this.label3.Location = new System.Drawing.Point(8, 136);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(112, 32);
            this.label3.TabIndex = 2;
            this.label3.Text = "Amount:";
            // label4
            this.label4.Location = new System.Drawing.Point(8, 184);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(104, 40);
            this.label4.TabIndex = 3;
            this.label4.Text = "Due To:";
            // textBox1
            this.textBox1.Location = new System.Drawing.Point(152, 24);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(128, 20);
            this.textBox1.TabIndex = 4;
            this.textBox1.Text = "textBox1";
            // textBox2
            this.textBox2.Location = new System.Drawing.Point(160, 80);
            this.textBox2.Name = "textBox2";
            this.textBox2.TabIndex = 5;
            this.textBox2.Text = "textBox2";
            // textBox3
            this.textBox3.Location = new System.Drawing.Point(160, 128);
            this.textBox3.Name = "textBox3";
            this.textBox3.Size = new System.Drawing.Size(112, 20);
            this.textBox3.TabIndex = 6;
            this.textBox3.Text = "textBox3";
            // textBox4
            this.textBox4.Location = new System.Drawing.Point(160, 184);
            this.textBox4.Name = "textBox4";
            this.textBox4.Size = new System.Drawing.Size(120, 20);
            this.textBox4.TabIndex = 7;
            this.textBox4.Text = "textBox4";
            // button1
            this.button1.Location = new System.Drawing.Point(8, 232);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(104, 40);
            this.button1.TabIndex = 8;
            this.button1.Text = "Send Payment";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // button2
            this.button2.Location = new System.Drawing.Point(160, 232);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(120, 40);
            this.button2.TabIndex = 9;
            this.button2.Text = "Process Payment";
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // Form1
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.textBox4);
            this.Controls.Add(this.textBox3);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.label4);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
        }
        #endregion
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
        private void button1_Click(object sender, System.EventArgs e)
        {
            Payment myPayment;
            myPayment.Payor = textBox1.Text;
            myPayment.Payee = textBox2.Text;
            myPayment.Amount = Convert.ToInt32(textBox3.Text);
            myPayment.DueDate = textBox4.Text;
            System.Messaging.Message msg = new System.Messaging.Message();
            msg.Body=myPayment;
            MessageQueue msgQ =new MessageQueue(".\\Private$\\billpay");
            msgQ.Send(msg);
        }
        private void button2_Click(object sender, System.EventArgs e)
        {
            MessageQueue msgQ = new MessageQueue(".\\Private$\\billpay");
            Payment myPayment=new Payment();
            Object o=new Object();
            System.Type[] arrTypes=new System.Type [2];
            arrTypes[0] = myPayment.GetType();
            arrTypes[1] = o.GetType();
            msgQ.Formatter = new XmlMessageFormatter(arrTypes);
            myPayment=((Payment)msgQ.Receive().Body);
            StringBuilder sb = new StringBuilder();
            sb.Append("Payment paid to: " + myPayment.Payor);
            sb.Append("\n");
            sb.Append("Paid by: " + myPayment.Payee);
            sb.Append("\n");
            sb.Append("Amount: $" + myPayment.Amount.ToString());
            sb.Append("\n");
            sb.Append("Due Date: " + Convert.ToDateTime(myPayment.DueDate));
            MessageBox.Show(sb.ToString(), "Message Received!");
        }
        public struct Payment
        {
            public string Payor,Payee;
            public int Amount;
            public string DueDate;
        }
    }
}

Not

Kod Visual Studio 2005'te değiştirilmelidir. Bir Windows Forms projesi oluşturduğunuzda, Visual C# varsayılan olarak projeye bir form ekler. Bu formun adı Form1'dir. Formu temsil eden iki dosya Form1.cs ve Form1.designer.cs olarak adlandırılır. Kodunuzu Form1.cs yazarsınız. Designer.cs dosyası, Windows Forms Designer'ın denetim ekleyerek gerçekleştirdiğiniz tüm eylemleri uygulayan kodu yazdığı yerdir. Visual C# 2005'teki Windows Forms Tasarımcısı hakkında daha fazla bilgi için bkz . Proje Oluşturma (Visual C#)

başa dön

Kodu doğrulama

  1. Hata Ayıklama menüsündeBaşlat'a tıklayın.

  2. Her metin kutusuna değerleri yazın ve Ödeme Gönder'e tıklayın.

  3. Bilgisayar Yönetimi konsoluna dönün. billpay altında Özel Kuyruklar içindeki Kuyruk iletileri klasörüne tıklayın ve ardından MSMQ'nin bir ileti aldığını doğrulayın (zarf simgesiyle gösterilir).

  4. İletiye sağ tıklayın, Özellikler'e tıklayın ve ardından Gövde sekmesine tıklayın. Ödeme iletisini fark edeceksiniz.

    Not

    Ödeme iletisinin içeriği XML olarak serileştirilir.

  5. Fatura ödemesi Windows uygulamasına dönün ve Ardından Ödemeyi İşle düğmesine tıklayın. bir iletinin alındığını onaylayan ve iletiyi görüntüleyen bir ileti kutusu görürsünüz.

başa dön

Sorun giderme

  • Özel kuyruğun olmaması genellikle yalnızca Windows 2000 Professional ve Windows XP Professional'da sorun oluşturur. Windows 2000 Server ve Windows XP Server genel kuyruğun kullanılmasına izin verir.

  • Doğru bağımsız değişkenleri XMLMessageFormatter() kurmak zorlayıcı olabilir. Bu örnekte, nesne veya Ödeme Türleri oluşturucuya geçirilen Tür dizisine dahil edilmemişse istisnalar fırlatılır.

başa dön