我正在开发一种解决方案,它将利用msmq在两台机器之间传输数据。由于所述机器的分离,我们需要对消息使用HTTP传输。
在我的测试环境中,我使用的是Windows 7 x64开发机器,它试图使用自制程序应用程序向我控制的几台测试机器中的任何一台发送消息。
所有计算机都是Windows Server 2003或安装了msmq和msmq http支持的服务器2008.
对于任何测试目的地,我可以成功使用以下队列路径名:
FORMATNAME:DIRECT = TCP:[machine_name_or_ip] \私人$ \ test_queue
但是对于任何测试目的地,以下总是失败
FORMATNAME:直接= $ / 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。
我愿意接受任何建议。
答案 0 :(得分:0)
也许您必须将$
编码为%24
。
答案 1 :(得分:0)
问题可能是由已通过防火墙NAT的目标服务器的IP地址引起的。
在这种情况下,IIS服务器接收消息okay并将其传递给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