1. 程式人生 > >ASP.NET中進行訊息處理(MSMQ)

ASP.NET中進行訊息處理(MSMQ)

   MSMQ是微軟訊息佇列的英文縮寫。那麼什麼是訊息佇列?這些介紹網上一大片這裡就不多說了。本文對於大蝦級的人物來說這只是小玩意而已,對於初學者來說這文章還是有一定的幫助,希望路過的大蝦們別笑話我班門弄斧。

一、MSMQ介紹和安裝訊息佇列
      關於MSMQ詳細的介紹請大家向
http://www.baidu.com/http://www.g.cn/等專家諮詢。
      使用訊息佇列的優點:穩定、訊息優先順序、離線能力以及安全性。
      訊息佇列分為使用者建立的佇列(專用佇列)和系統佇列,使用者佇列分為,。我是Windows XP,看下圖所示(myQueue為自己建立的訊息佇列,msmqtriggersnotifiations為通用佇列):
               


     對訊息佇列有了簡單的瞭解後,使用MSMQ進行軟體開發需要安裝MSMQ,安裝完後就該進入實際的開發階段。具體的安裝過程就是在控制面板裡“新增/刪除程式”下“新增/刪除Windows元件”,完成新增就OK。安裝完成後就可以通過互動界新增新的訊息佇列,詳細如下圖:
          
      出了上面這種互動介面來建立MSMQ外,也可以通過程式設計來完成,.NET框架裡的MessageQueue類下有一靜態方法Create,用來完成訊息佇列的建立,其定義如下:
 1// 2// 摘要:
 3//    在指定的路徑中建立非事務性“訊息佇列”佇列。
 4// 5// 引數:
 6//   path:
 7//     要建立的佇列的路徑。
 8// 9// 返回結果:
10//     表示新佇列的 System.Messaging.MessageQueue。11publicstatic MessageQueue Create(string path);
12//13// 摘要:
14//     在指定的路徑中建立事務性或非事務性“訊息佇列”佇列。
15//16// 引數:
17//   transactional:
18//     如果建立事務性佇列,為 true;如果建立非事務性佇列,則為 false。
19//20//   path:
21//     要建立的佇列的路徑。
22//23// 返回結果:
24//     表示新佇列的 System.Messaging.MessageQueue。25public
static MessageQueue Create(string path, bool transactional);
     實現訊息佇列的建立簡單程式碼(C#),建立一個名為"myQueue"的非事務性"訊息佇列",如下: MessageQueue.Create(@"./private$/myQueue");
二、建立、刪除和管理佇列
      在.NET環境下編寫Message Queue程式的前提就是需要先安裝MSMQ,本文之前已經作了詳細的介紹。要開發MSMQ程式就必須學習一個很重要的類(MessageQueue),該類位於名稱空間System.Messageing下。其中有幾個常用的方法必須掌握:
  --Create方法:建立使用指定路徑的新訊息佇列。
  --Delete方法:刪除現有的訊息佇列。
  --Existe方法:檢視指定訊息佇列是否存在。
  --GetAllMessages()方法:得到佇列中的所有訊息。
  --GetPublicQueues方法:在“訊息佇列”網路中定位訊息佇列。
  --Peek/BeginPeek方法:檢視某個特定佇列中的訊息佇列,但不從該佇列中移出訊息。
  --Receive/BeginReceive方法:檢索指定訊息佇列中最前面的訊息並將其從該佇列中移除。
  --Send方法:傳送訊息到指定的訊息佇列。
  --Purge方法:清空指定佇列的訊息。

    上述列舉的方法在此就不作詳細介紹,大家可以通過下面的示例程式中來體會他們各自的功能。

三、傳送和序列化訊息
     MSMQ訊息佇列中定義的訊息由一個主體(body)和若干屬性構成。訊息的主體可以由文字、二進位制構成,根據需要還可以被加密。在MSMQ 中訊息的大小不能夠超過4MB。傳送訊息是通過Send方法來完成的,需要一個Message引數。
1、傳送訊息:
     步驟:連線佇列-->指定訊息格式-->提供要傳送的資料(主體)-->呼叫Send()方法將訊息傳送出去。詳細見後面的示例程式。

2、序列化訊息:
     訊息序列化可以通過.NET Framework附帶的三個預定義格式化程式來完成:
    --  XMLMessageFormatter物件----MessageQueue元件的預設格式化程式設定。
    --  BinaryMessageFormatter物件;
    --  ActiveXMessageFormatter物件; 
    由於後兩者格式化後的訊息通常不能為人閱讀,所以我們經常用到的是XMLMessageFormatter物件。該物件構造方法有三種過載: 1public XmlMessageFormatter();
2public XmlMessageFormatter(string[] targetTypeNames);
3public XmlMessageFormatter(Type[] targetTypes); 如我們後面的示例程式中用到的序列化語句: 1//序列化為字串2XmlMessageFormatter formatter =new XmlMessageFormatter(new Type[] typeof(string) });
四、讀取和接收訊息
1、讀取訊息:
    也就是從指定佇列中獲取訊息,詳細請檢視本文前面的關於訊息操作的方法介紹。
2、接收訊息有兩種方式:
    --> 通過Receive方法--具體功能請返回本文前面有詳細介紹。
    --> 通過Peek方法--具體功能請返回本文前面有詳細介紹。

五、訊息使用例項
     通過上面一系列的介紹,瞭解了MessageQueue類和常用的方法後,下面我們通過一個簡單的示例程式來分析訊息佇列的建立、傳送訊息以及接收訊息等相關知識點:
1、通過Create方法建立使用指定路徑的新訊息佇列
 1///<summary> 2/// 通過Create方法建立使用指定路徑的新訊息佇列
 3///</summary> 4///<param name="queuePath"></param>

 5publicstaticvoid Createqueue(string queuePath)
 6{
 7    try 8    {
 9        if (!MessageQueue.Exists(queuePath))
10        {
11            MessageQueue.Create(@"./private$/myQueue");
12        }
13        else14        {
15            Console.WriteLine(queuePath +"已經存在!");
16        }
17    }
18    catch (MessageQueueException e)
19    {
20        Console.WriteLine(e.Message);
21    }
22}

2、連線訊息佇列併發送訊息到佇列  1///<summary> 2/// 連線訊息佇列併發送訊息到佇列
 3///</summary>

 4publicstaticvoid SendMessage()
 5{
 6    try 7    {
 8        //連線到本地的佇列 9        MessageQueue myQueue =new MessageQueue(".//private$//myQueue");
10        
11        Message myMessage =new Message();
12        myMessage.Body ="訊息內容";
13        myMessage.Formatter =new XmlMessageFormatter(new Type[] typeof(string) });
14        //傳送訊息到佇列中15        myQueue.Send(myMessage);
16    }
17    catch (ArgumentException e)
18    {
19        Console.WriteLine(e.Message);
20    }
21}

3、連線訊息佇列並從訊息佇列中接收訊息  1///<summary> 2/// 連線訊息佇列並從佇列中接收訊息
 3///</summary>

 4publicstaticvoid ReceiveMessage()
 5{
 6    //連線到本地佇列 7    MessageQueue myQueue =new MessageQueue(".//private$//myQueue");
 8    myQueue.Formatter =new XmlMessageFormatter(new Type[] typeof(string) });
 9    try10    {
11        //從佇列中接收訊息12        Message myMessage = myQueue.Receive();
13        string context = (string)myMessage.Body; //獲取訊息的內容14        Console.WriteLine("訊息內容為:"+ context);
15    }
16    catch (MessageQueueException e)
17    {
18        Console.WriteLine(e.Message);
19    }
20    catch (InvalidCastException e)
21    {
22        Console.WriteLine(e.Message);
23    }
24}

4、連線佇列並清空佇列的全部訊息
1///<summary>2/// 清空指定佇列的訊息
3///</summary>

4publicstaticvoid ClearMessage()
5{
6    MessageQueue myQueue =new MessageQueue(".//private$//myQueue");
7    myQueue.Purge();
8}

5、連線佇列並獲取佇列的全部訊息  1///<summary> 2/// 連線佇列並獲取佇列的全部訊息
 3///</summary>

 4publicstaticvoid GetAllMessage()
 5{
 6    //連線到本地佇列 7    MessageQueue myQueue =new MessageQueue(".//private$//myQueue");
 8    Message[] message = myQueue.GetAllMessages();
 9    XmlMessageFormatter formatter =new XmlMessageFormatter(new Type[] typeof(string) });
10    for (int i =0; i < message.Length; i++)
11    {
12        message[i].Formatter = formatter;
13        Console.WriteLine(message[i].Body.ToString());
14    }
15}

     上面依次的列舉出來5個方法,這裡我就不做測試了。上述方法全部通過測試的,我在後面提供個連線,沒弄清楚的朋友可下載源程式自己去執行除錯下。

六、複雜訊息傳送例項
     通過上面一系列的介紹,對於簡單訊息的傳送和接收及訊息的管理應該都不會有什麼問題了,下面我在介紹一下關於複雜的訊息處理,現在有這樣一個需求,要求通過訊息佇列將一本圖書資訊傳送到佇列裡,然後從訊息佇列裡讀取出來。圖書的基本資訊包括圖書編號、圖書名稱、圖書作者以及圖書定價,這樣的一個複雜的物件型別怎麼來傳輸呢?詳細如下:
 1namespace MSMQ.App
 2{
 3    publicclass MsgQueue
 4    {
 5        ///<summary> 6        /// 通過Create方法建立使用指定路徑的新訊息佇列
 7        ///</summary> 8

相關推薦

ASP.NET進行訊息處理(MSMQ)

   MSMQ是微軟訊息佇列的英文縮寫。那麼什麼是訊息佇列?這些介紹網上一大片這裡就不多說了。本文對於大蝦級的人物來說這只是小玩意而已,對於初學者來說這文章還是有一定的幫助,希望路過的大蝦們別笑話我班門弄斧。一、MSMQ介紹和安裝訊息佇列       關於MSMQ詳細的介紹

Asp.Net MVC WebAPI的建立與前臺Jquery ajax後臺HttpClient呼叫詳解 Asp.Net對操作Sql Server 簡單處理的SqlDB類

1、什麼是WebApi,它有什麼用途?           Web API是一個比較寬泛的概念。這裡我們提到Web API特指ASP.NET MVC Web API。在新出的MVC中,增加了WebAPI,用於提供REST風格的WebService,新生成的W

ASP.NET 如何對生成的 HTML 內容流進行控制?

在進行 ASP.NET 開發時,有時候需要對頁面輸出的最終 HTML 原始碼進行控制,是頁面的 render 方法中很容易實現這個功能。下面就是一個實現的方法,註釋都在程式碼中。 <%@ Page Language="C#" %> <%@ Import

如何在asp.net使用百度地圖並動態獲取到資料庫的座標點進行標註

前段時間忙於公司的一個專案,專案中一個功能就是動態獲取資料庫的經緯度資訊並在百度地圖上進行標註,剛開始在網上查了很多資料還是沒能解決,也發現很多網友都遇到過這樣的問題,最後查閱資料過程中看到別人的文章,恍然大悟,然後重新程式碼順利解決。下面將本人的解決方法做一下介紹,供各位

asp.net自定義錯誤處理頁面

兩種方法均為全站出錯處理方法一:1、新增Web.config, <system.web></system.web>中新增<customErrors mode="On" defaultRedirect="ApplicationErroy.aspx" ></custo

asp.net,我用c#進行AD操作,新增使用者

如果要查詢所有容器下的user,用DirectorySearcher DirectoryEntry objDE=new DirectoryEntry("LDAP://yourserver","Administrator","pwd",System.DirectoryServices.Authenticat

asp.net處理程式呼叫HttpContext.Current.Session獲取值出錯

asp.net中處理程式呼叫System.Web.HttpContext.Current.Session獲取Session時提示錯誤:未將物件引用設定到物件的例項。 解決辦法:在處理程式檔案類中實現IRequiresSessionState介面,如:public class

ASP.NET的ASHX一般處理程式Session為null且不能賦值

首先我解釋一下 ashx檔案以前我們做ajax處理的時候要用常用的web介面處理。 現在不用了,微軟有ashx檔案,這個檔案就是後臺一些處理檔案,用extjs的同學可能會更清楚一點。 如果在這個檔案中用session,會提示失效的,網上找了很久終於找到解決辦法如下 如圖所

asp.net c# 通過訊息佇列處理高併發請求(以搶小米手機為例)

  網站面對高併發的情況下,除了增加硬體, 優化程式提高以響應速度外,還可以通過並行改序列的思路來解決。這種思想常見的實踐方式就是資料庫鎖和訊息佇列的方式。這種方式的缺點是需要排隊,響應速度慢,優點是節省成本。 演示一下現象 建立一個在售產品表 CREATE TABLE [dbo].[product](

asp.net的cookie

再次 創建cookie bpa form void 並且 ima 顯示 red 一.cookie導讀,理解什麽是cookie 1.什麽是cookie:cookie是一種能夠讓網站服務器把少量數據(4kb左右)存儲到客戶端的硬盤或內存。並且讀可以取出來的一種技術。 2.

ASP.NET的驗證控件

spl 允許 需要 解決 ova 自帶 mar integer object ASP.NET提供了如下的控件:  RequiredFieldValidator: 字段必填 (ControlTovalidate設定要驗證的控件)  RangeValidator: 值在給定的最

ASP.NET的母版頁

建議 cli 路徑 pla 自動 webapp 一個 服務 如果 添加一個"母版頁",使用<asp:ContentPlaceHolder>挖坑,新建的母版頁已經自動設置了兩個ContentPlaceHolder創建使用母版頁的具體頁面,WebSite是新建"We

ASP.NET的Request、Response、Server對象

.html languages asa 地址欄 判斷 nsf 一次 服務 tco Request對象 Response.Write(Request.ApplicationPath) //應用根路徑Request.AppRelativeCurrentExecutionFile

ASP.NETC#生成二維碼

保存 mss 軟件 clear 所有 str drawing for visual ASP.NET中用C#語言編寫網頁,將自己輸入的文字生成二維碼。 工具/原料 已安裝好VS2010或其他版本VS軟件的電腦一臺 1、新建 1

動態生成頁面(一)——ASP.NETLiteral使用

case colspan label 奇偶數 容器 業務邏輯 con stringbu font 在頁面中加入內容時,假設是靜態內容。無需使用容器,能夠直接將標記作為HTML直接加入到頁面中;可是,假設是動態內容,則必須借助容器將內容加入到頁面中。典型的容器

ASP.NET的配置文件

機器 針對 str ont 軟件安裝 宋體 一點 讀取 找文件  在機房收費系統的時候以前應用過配置文件,當時也就那麽一用對配置文件了解的不是非常透徹。以下就來總結一下有關配置文件的一些操作。 什麽是配置文件

深入理解asp.net的 __doPostBack函數

control mar find ros 理解 額外 工具 服務器 們的   前段時間做一個.net網站的時候,用到了模擬前端按鈕刷新updatePanel進行局部刷新的時候,遇見了這個問題,當時沒顧上記下來,查看網上資料,記下來留著以後查看.   很早以前,當我剛接觸a

ASP.NET的參數與特殊類型和特性

初始 name 泛型類 new console multiple blog net 通過 一、可選參數和命名參數 1、可選參數 語法: [修飾符] 返回類型 方法名(必選參數1...必選參數n,可選參數1..

ASP.NET JSON 的序列化和反序列化

urn 序列 del nbsp parseint 代碼 href end user JSON是專門為瀏覽器中的網頁上運行的JavaScript代碼而設計的一種數據格式。在網站應用中使用JSON的場景越來越多,本文介紹ASP.NET中JSON的序列化和反序列化,主要對JSON

解決ASP.NETServiceStack.Redis每小時6000次訪問請求的問題

asp log style ack div net pre 小時 使用 1.可以使用3.0的版本: Install-Package ServiceStack.Redis -Version 3.0 2.使用ServiceStack.Redis.Complete: Ins