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

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

Orijinal ü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 kuyruktan okuma ve görüntüleme için ileti içeriğini seri durumdan çıkarma.

Gereksinimler

Aşağıdaki öğeler önerilen donanım, yazılım, ağ altyapısı, beceriler 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 Sunucu) veya Windows XP Professional (veya Sunucu).

Bu makalede, aşağıdakilere aşina olduğunuz da varsayılır:

  • MSMQ
  • Komut istemindeki araçları kullanma

başa dön

MSMQ'ya yazma ve MSMQ'dan okuma

System.Messaging.NET Framework ad alanı, MSMQ'dan okumanız ve yazmanız gereken sınıflara sahiptir. Ç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. Görünmüyorsa Çözüm Gezgini görüntülemek için CTRL+ALT+L tuşlarına basın. Çözüm Gezgini'daBaşvurular'a sağ tıklayın ve ardından Başvuru Ekle'ye tıklayın.

  4. .NET sekmesinde, .dll dosyaları listesindenSystem.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 Form1.cs çift tıklayın.

  6. Araç kutusunu açmak için CTRL+ALT+X tuşlarına basın. Araç Kutusu'ndaWindows 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 dört satırdır (her etiketin sağ kısmında 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 aşağıdaki şekilde ayarlayın (sırayla):

    • Ödeme Yöntemi:
    • Adınız:
    • Tutar:
    • Son Tarih:
  9. Özellikler iletişim kutusunda, button1 öğesinin Text özelliğini Ödeme Gönder olarak, button2'nin Text özelliğini de Ödemeyi İşle olarak ayarlayın.

  10. Bu uygulama, önce Bilgisayar Yönetimi konsolunda oluşturmanız gereken özel bir kuyrukla çalışır. Bunu yapmak için şu adımları uygulayın:

    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 Özel Kuyruk'a tıklayın.

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

    Not

    İşlem 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 System.Text ad alanında bulunan ek sınıfları dahil etmek için sınıf bildiriminden System.Messaging önce iki USING deyim ekleyin. (Ad System.Text alanı, dizeleri birleştirirken kullanmanın en iyi olduğu yeni bir .NET Framework sınıfı olan sınıfın kullanımına StringBuilder yöneliktir.)

    using System.Messaging;
    using System.Text;
    
  14. Ödemeyi tanımlayan verileri barındırmak için değişkenleri 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 olayına Clickbutton1ekleyin.

    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. Sınıfının bir örneğini Message oluşturun ve ardından özelliğini yapısına payment ayarlayınBody:

      System.Messaging.Message msg = new System.Messaging.Message();
      msg.Body=myPayment;
      
    3. MSMQ'ya ileti göndermek için sınıfının bir örneğini MessageQueue oluşturun ve nesnesine Send geçen yöntemini çağırın Message . MessageQueue sınıfı 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 biçimindedir machinename\Private$\queuename. Yerel konak makinelere nokta veya nokta (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 seri hale getirmektedir. İ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. sınıfına geçirmek XMLMessageFormatter için bir tür 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 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 açıklar.

    3. İletiler yöntemi çağrılarak Receive alınır. İleti içeriğini Body okumak için özelliğine erişin. Body özelliği bir nesne döndürür, bu nedenle nesnenin kullanılabilir bir formdaki içeriği almak için ö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. Windows Forms bir proje oluşturduğunuzda, Visual C# varsayılan olarak projeye bir form ekler. Bu form Form1 olarak adlandırılır. Formu temsil eden iki dosya Form1.cs ve Form1.designer.cs olarak adlandırılır. Kodunuzu Form1.cs'da yazarsınız. Tasarım Aracı.cs dosyası, Windows Forms Tasarım Aracı denetim ekleyerek gerçekleştirdiğiniz tüm eylemleri uygulayan kodu yazdığı yerdir. Visual C# 2005'teki Windows Forms Tasarım Aracı hakkında daha fazla bilgi için bkz. Proje Oluşturma (Visual C#)

başa dön

Kodu doğrulama

  1. Hata Ayıkla menüsünde Baş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. Özel Kuyruklar'dafatura ödemesi altındaki Kuyruk iletileri klasörüne tıklayın ve MSMQ'un bir ileti (zarf simgesiyle gösterilir) aldığını doğrulayın.

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

    Not

    Ödeme iletisinin içeriği XML olarak seri hale getirilir.

  5. Fatura ödemesi Windows uygulamasına dönün ve Ödemeyi İşle düğmesine tıklayın. İletinin 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 bir sorundur. Windows 2000 Server ve Windows XP Server, genel kuyruğun kullanılmasına izin verir.

  • Doğru bağımsız değişkenlerin geçirilmesi XMLMessageFormatter() zor olabilir. Bu örnekte, nesnesi veya Ödeme Türleri oluşturucuya geçirilen Tür dizisine dahil edilmediyse özel durumlar oluşturulur.

başa dön