8

我目前正在尝试将 MSMQ 与 C# 和 .NET 一起使用以实现 IPC。我试图了解它是如何工作的,并且在访问 MSMQ queues 时对 Path name 和 Format name 之间的区别感到非常困惑。我在以下帖子中发现了一些类似的问题:

  1. 通过 HTTP 的 MSMQ 调用未到达目标队列
  2. 如何设置 MSMQ 服务器以便可以通过 Internet 访问它
  3. 如何通过各自的 WCF 绑定通过 http 使用 MSMQ?

但是,他们都在使用 MSMQ 和 WCF,我暂时不想使用 WCF。

我想要实现的是以下内容:

客户端:通过http向队列发送数据。

服务器:通过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

有没有人知道我如何调试这个,或者即使我想做的事情可以通过这些方式实现?

4

1 回答 1

0

指定 HTTP 或 HTTPS 协议的直接格式名称不能用于查看或接收消息,只能用于发送它们

于 2021-08-12T06:57:56.873 回答