我目前正在尝试将 MSMQ 与 C# 和 .NET 结合使用以实现 IPC。
我试图理解它是如何工作的,但我对它很困惑访问 MSMQ 队列时路径名称和格式名称之间的差异。
我在以下帖子中发现了一些类似的问题:
- 通过 HTTP 的 MSMQ 调用未到达目标队列
- 如何设置 MSMQ 服务器以便可以通过 Internet 访问它
- 如何通过相应的 WCF 绑定使用 MSMQ over http?
不过,他们都在使用MSMQ和WCF,我暂时不想使用WCF。
我想要实现的目标如下:
Client:通过将数据发送到队列http.
Server:通过以下方式从队列接收数据http.
我的观点是我想要服务器、客户端和队列托管在可能不同的计算机上。 (现在我正在同一台机器上测试所有内容)。
这里我有以下代码,它演示了我的想法:
首先,我创建队列:
if(!System.Messaging.MessageQueue.Exists(@".\Private$\SimplestExamplePrivateQueue");
System.Messaging.MessageQueue.Create(@".\Private$\SimplestExamplePrivateQueue");
客户端代码:
然后,在客户端,我有一个回调函数,当用户按下按钮以发送消息时会调用该回调函数。
private void button1_Click(object sender, System.EventArgs e)
{
try
{
// Create a connection to the queue
System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(@"FormatName:Direct=http://localhost/msmq/Private$/SimplestExamplePrivateQueue");
// Create a point object to send
Point myPoint = new Point (Convert.ToInt32(textBox2.Text), Convert.ToInt32(textBox3.Text)) ;
// Send object
mq.Send (myPoint) ;
}
// Catch the exception that signals all types of error
// from the message queueing subsystem. Report error
// to the user.
catch (System.Messaging.MessageQueueException mqx)
{
MessageBox.Show (mqx.Message) ;
}
到这里为止一切都正常。
服务器代码:
然后,我有一个按钮,它调用回调函数以从服务器端的队列中同步读取一条消息:
private void button1_Click(object sender, EventArgs e)
{
try
{
// Create a connection to the queue
var mq = new MessageQueue(@"Direct=http://localhost/msmq/Private$/SimplestExamplePrivateQueue");
// Set the queue's formatter to decode Point objects
mq.Formatter = new XmlMessageFormatter(new[] {typeof (Point)});
// Receive message synchronously
Message msg = mq.Receive();
// Convert received message to object that we think was sent
var pt = (Point) msg.Body;
// Display it to the user
MessageBox.Show(pt.ToString(), "Received Point");
}
// Report any exceptions to the user. A timeout would cause such
// an exception
catch (Exception x)
{
MessageBox.Show(x.Message);
}
}
以我对 MSMQ 的(有限)理解,这应该可行。然而,当我打电话时Message msg = mq.Receive();
我得到以下异常:
The specified format name does not support the requested operation. For example, a direct queue format name cannot be deleted.
和堆栈跟踪:
at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
at System.Messaging.MessageQueue.StaleSafeReceiveMessage(UInt32 timeout, Int32 action, MQPROPS properties, NativeOverlapped* overlapped, ReceiveCallback receiveCallback, CursorHandle cursorHandle, IntPtr transaction)
at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 action, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
at System.Messaging.MessageQueue.Receive()
at InternetQueueingRecipient.Form1.button1_Click(Object sender, EventArgs e) in c:\Users\felipedalcin\Documents\MSMQ\MSMQandNET\InternetQueuing\InternetQueueingRecipient\Form1.cs:line 85
有谁知道我如何调试这个,或者即使我想做的事情可以通过这些方式实现?