2010-03-31 96 views
0

我正在開發一種利用msmq在兩臺機器之間傳輸數據的解決方案。由於所述機器的分離,我們需要使用HTTP傳輸來處理消息。HTTP錯誤:當通過http發送msmq消息時發生400問題

在我的測試環境中,我使用的是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

我願意接受任何建議。

+0

我有完全相同的問題。你有沒有解決這個問題? – user808933 2011-06-21 17:26:58

+0

對不起,我沒有。在我真正需要實施任何解決方案之前,該項目已被取消。然而,有人似乎提供了一個未經測試(由我)但下面可信的似乎答案。 – dontera 2011-07-26 23:05:16

回答

0

該問題可能是由目標服務器的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

0

也許你必須編碼$%24