【问题标题】:HTTP Error: 400 when sending msmq message over httpHTTP 错误:通过 http 发送 msmq 消息时出现 400
【发布时间】:2010-03-31 17:32:43
【问题描述】:

我正在开发一种解决方案,该解决方案将利用 msmq 在两台机器之间传输数据。由于这些机器是分开的,我们需要使用 HTTP 传输消息。

在我的测试环境中,我使用的是 Windows 7 x64 开发机器,它尝试使用自制应用程序将消息发送到我可以控制的几台测试机器中的任何一台。

所有机器都是安装了 msmq 和 msmq http 支持的 windows server 2003 或 server 2008。

对于任何测试目标,我都可以成功使用以下队列路径名:

FORMATNAME:DIRECT=TCP:[machine_name_or_ip]\private$\test_queue

但是对于任何测试目的地,以下总是失败

FORMATNAME:DIRECT=$/test_queue

我已经使用了所有可用的机器名称/ips 排列。我使用this blog post 中描述的方法创建了映射。所有结果都是相同的 HTTP 错误:400

以下是用于发送消息的代码:

       MessageQueue mq = new MessageQueue(queuepath);

        System.Messaging.Message msg = new System.Messaging.Message
                                           {                                                       
                                               Priority = MessagePriority.Normal,
                                               Formatter = new XmlMessageFormatter(),
                                               Label = "test"
                                           };
        msg.Body = txtMessageBody.Text;
        msg.UseDeadLetterQueue = true;
        msg.UseJournalQueue = true;
        msg.AcknowledgeType = AcknowledgeTypes.FullReachQueue | AcknowledgeTypes.FullReceive; 
        msg.AdministrationQueue = new MessageQueue(@".\private$\Ack");

        if (SendTransactional)
            mq.Send(msg, MessageQueueTransactionType.Single);
        else
            mq.Send(msg);

附加信息:在目标机器上的 IIS 日志中,我可以看到我发送的每条消息都被记录为状态码为 200 的 POST。

我愿意接受任何建议。

【问题讨论】:

  • 我遇到了完全相同的问题。你解决过这个问题吗?
  • 对不起,我没有。在我真正需要实施任何解决方案之前,该项目就被取消了。但是,似乎有人在下面提供了一个未经测试(由我)但看似可信的答案。

标签: http msmq


【解决方案1】:

此问题可能是由于目标服务器的 IP 地址已通过防火墙进行了 NAT。

在这种情况下,IIS 服务器可以正常接收消息并将其传递给 MSMQ。 MSMQ 然后读取消息并将消息的目的地视为与服务器的已知 IP 地址不同的东西。此时 MSMQ 拒绝该消息,IIS 返回 HTTP 状态 400。

幸运的是,解决方案相当简单。查看%windir%\System32\msmq\mapping。此文件夹可以包含一堆 xml 文件(通常提供示例文件),每个文件都包含一个地址和另一个地址之间的映射。文件名可以是任何你喜欢的,这里是一个xml格式内容的例子:

<redirections xmlns="msmq-queue-redirections.xml">
  <redirection>
    <from>http://external_host/msmq/external_queue</from>
    <to>http://internal_host/msmq/internal_queue</to> 
  </redirection>
</redirections>

然后,MSMQ 服务需要重新启动以获取新配置,例如从命令行:

net stop msmq
net start msmq

参考资料:

http://blogs.msdn.com/b/johnbreakwell/archive/2008/01/29/unable-to-send-msmq-3-0-http-messages.aspx

http://msdn.microsoft.com/en-us/library/ms701477(v=vs.85).aspx

【讨论】:

    【解决方案2】:

    也许您必须将$ 编码为%24

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 2016-12-22
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多