WCF 整合了 .NET 所有分散式技術,但技術更替非一蹴而就,既有系統維護、文獻閱讀、問題診斷都需要扎實的基礎知識。
Microsoft Message Queue (MSMQ):異步傳輸模式,支援同機器或跨網路應用間通訊。發送者將訊息置入佇列,接收者稍後從佇列取出處理 —— 典型「存儲轉發」模型。
| 類型 | 特性 |
|---|---|
| 公用佇列 | 全網路複寫,所有站點可存取 |
| 私有佇列 | 僅本機可見,需完整路徑/標籤存取 |
| 管理佇列 | 存放回執確認訊息 |
| 回應佇列 | 接收端返回的回應訊息 |
鬆耦合特性使其成為 SOA 實現方式之一。
控制台 → 新增/移除 Windows 元件 → 訊息佇列。安裝後可在「電腦管理 → 服務與應用程式 → 訊息佇列」查看。


System.Messaging.dll
static void Main()
{
// 公用佇列
if (!MessageQueue.Exists(@".\FrankMSMQ"))
using (var mq = MessageQueue.Create(@".\FrankMSMQ"))
{
mq.Label = "FrankPublicQueue";
mq.Send("MSMQ Message", "Frank.Xu");
}
// 私有佇列
if (!MessageQueue.Exists(@".\Private$\FrankMSMQ"))
using (var mq = MessageQueue.Create(@".\Private$\FrankMSMQ"))
{
mq.Label = "FrankPrivateQueue";
mq.Send("MSMQ Private Message", "Frank.Xu");
}
// 向所有公用佇列發送
foreach (var mq in MessageQueue.GetPublicQueues())
mq.Send("Sending MSMQ public message " + DateTime.Now.ToLongDateString(), "Frank.Xu");
// 向特定私有佇列發送
if (MessageQueue.Exists(@".\Private$\FrankMSMQ"))
new MessageQueue(@".\Private$\FrankMSMQ")
.Send("Sending MSMQ private message " + DateTime.Now.ToLongDateString(), "Frank.Xu");
Console.Read();
}
static void Main()
{
// 公用佇列
if (MessageQueue.Exists(@".\FrankMSMQ"))
using (var mq = new MessageQueue(@".\FrankMSMQ"))
{
mq.Formatter = new XmlMessageFormatter(new[] { "System.String" });
Message msg = mq.Receive();
Console.WriteLine("Received: {0}", msg.Body);
}
// 私有佇列
if (MessageQueue.Exists(@".\Private$\FrankMSMQ"))
using (var mq = new MessageQueue(@".\Private$\FrankMSMQ"))
{
mq.Formatter = new XmlMessageFormatter(new[] { "System.String" });
Message msg = mq.Receive();
Console.WriteLine("Received Private: {0}", msg.Body);
}
Console.Read();
}
MessageQueue.Create 建立佇列,路徑格式:.\QueueName (公用)、.\Private$\QueueName (私有)。Formatter 必須設定:XmlMessageFormatter (XML 序列化)、BinaryMessageFormatter (二進位)、ActiveXMessageFormatter (COM 相容)。[Serializable]。下一篇將介紹 .NET Remoting 基礎與開發實作。
完整代碼下載:MSMQ.rar