2010-10-05 61 views
8

我有服務器THOR上的事務性MSMQ隊列設置。我能夠從工作站郵件投遞到該隊列用下面的代碼:爲什麼我排隊的WCF消息悄然消失?

var queue = new MessageQueue("FormatName:Direct=OS:thor\\private\\myqueue"); 
using (var tx = new MessageQueueTransaction()) 
{ 
    tx.Begin(); 
    queue.Send("test", tx); 
    tx.Commit(); 
} 

然而,當我嘗試使用WCF我的郵件永遠不會出現在隊列中進行連接。下面是我使用的配置:

<system.serviceModel> 
    <bindings> 
    <netMsmqBinding> 
     <binding name="ClientNewsFeedServiceBinding" durable="true" exactlyOnce="true"> 
     <security mode="None" /> 
     </binding> 
    </netMsmqBinding> 
    </bindings> 

    <client> 
    <!-- NewsFeed Service --> 
    <endpoint name="INewsFeedService" 
       address="net.msmq://thor/private/myqueue" 
       binding="netMsmqBinding" 
       bindingConfiguration="ClientNewsFeedServiceBinding" 
       contract="Service.Contract.INewsFeedService" /> 
    </client> 
</system.serviceModel> 

,代碼:

using (var tx = new TransactionScope()) 
{ 
    var cf = new ChannelFactory<INewsFeedService>("INewsFeedService"); 
    var service = cf.CreateChannel(); 
    service.TestMessage("test"); 
    ((IChannel)service).Close(); 
    tx.Complete(); 
} 

我得不到任何形式的例外情況,但沒有公佈於THOR隊列消息。有任何想法嗎?我甚至不知道如何調試,因爲它只是默默地失敗。

UPDATE

如果我改變我的MSMQ URI爲 'net.msmq://本地主機/私營/ myQueue中',那麼它會發布到本地事務性隊列我有安裝。隊列本身的設置是相同的(因爲我執行相同的步驟來創建localhost和THOR隊列)。

+1

這些消息是否顯示在您的事務性死信隊列中? – 2010-10-05 15:59:31

+0

不,沒有出現在交易DLQ – AgileJon 2010-10-05 16:00:30

+0

更新我的答案 - 你檢查了所有涉及的機器上的DTC? – 2010-10-05 20:54:50

回答

0

嘗試在關閉通道之前完成交易範圍。

當您關閉頻道時,您將失去與該頻道的聯繫,因此它有一個未提交的交易,該交易最終被丟棄。

+0

這沒有奏效。你說什麼是有道理的,但似乎沒有什麼區別。 – AgileJon 2010-10-05 16:14:11

3

我相信,如果你讓你的隊列事務的MSMQ服務器端,你需要指定你的WCF綁定配置幾個設置 - 試試這個:

<bindings> 
    <netMsmqBinding> 
     <binding name="ClientNewsFeedServiceBinding" 
       durable="true" exactlyOnce="true"> 
     <security mode="None" /> 
     </binding> 
    </netMsmqBinding> 
    </bindings> 

如果我沒有記錯的話,你需要將durable="true"exactlyOnce="true"屬性添加到您的netMsmq綁定中才能使用。

有一個關於如何獲得MSMQ和WCF很好地協同工作一個很好的教程:

湯姆涵蓋事務性隊列在第3部分,並提及:

exactlyOnce =「true」屬性爲 WCF-表示使用事務性消息隊列 。

durable=true只意味着讓消息立即刷新到磁盤,而不是保留在服務器內存中。速度較慢,但​​在服務器崩潰或電源中斷的情況下,消息不會丟失。經典的速度與可靠性權衡....

更新:,因爲你要「跨越」機器邊界,而你正在使用事務性隊列 - 有你在所有機器上檢查DTC(分佈式事務處理協調器)參與?看看Tom的博客第3部分:

檢查DTC配置

我們的史詩般的旅程幾乎是結束了。 事實上,如果您仍然在家裏玩 ,您可以嘗試運行 應用程序和事務性 隊列來查看它是否正常工作。 如果 失敗,則可能的原因是您的分佈式事務處理協調器配置中存在 問題。 這裏有一些事情要嘗試:

+0

試過了,不行。我添加了一個更新到我原來的帖子,說我能夠運行WCF代碼,如果我更新我的MSMQ URI指向本地主機而不是THOR。 – AgileJon 2010-10-05 17:40:55

0

我有類似的問題,所以我希望這有助於清單:

  1. 連接:我想,雷神DNS條目的工作,是不是它?檢查它是否允許ping ...
  2. 不同域名的權限:我之前有一些衝突問題,原因是權限。我測試的本地計算機位於與服務器不同的域中。檢查Thor和你的機器是否在同一個域中。有可能使它跨域,但我不能讓它工作(所以我把我的測試移動到同一個域中的機器上)
  3. 隊列工具:雖然你可以從管理工具看到隊列,但我發現隊列資源管理器工具(http://cogin.com/mq/index.php)相當有用。您可以檢查消息卡在哪裏。

注:大概1是好的,但只是在情況下,我把它...

0

您需要使用MsmqIntegrationBinding。由於WCF不知道它們是什麼,因此消息未被識別並被丟棄。

+1

我以爲MsmqIntegrationBinding是用於WCF應用程序和非WCF應用程序之間的互通。我手動在隊列中添加內容的示例代碼僅僅是爲了表明它不是一個簡單的「關閉防火牆」問題。在生產中,隊列只能被WCF服務訪問。 – AgileJon 2010-10-11 21:28:21

+0

我的歉意,我的眼睛跳過了第二個客戶端。客戶端是XP機器嗎?我們在XP中遇到了Kerberos問題。有一個補丁。 – 2010-10-11 22:52:03

1

我有同樣的問題。在嘗試了這裏列出的所有想法之後,我開始尋找其他的東西。事實證明,當您選擇安全模式我的郵件的發件人屬性留空(見下圖)。當它被髮送到一個localhost

MSMQ Message properties

這種消息將被接受但它將由遠程服務器被拒絕。

爲了使其工作,你有幾種選擇:

  1. 啓用身份驗證
  2. 格蘭特發送權限匿名登錄

第一個選項,如果當然更安全但它需要MSMQ與Active Directory集成進行安裝。

+0

不確定關於WCF,但這解決了我與NServiceBus和MSMQ發送消息到不同的機器,並讓他們無聲地丟棄類似的問題。將「匿名登錄」權限添加到修復它的隊列中(儘管我已經擁有完全控制權的「每個人」)! – bk0 2014-07-04 01:12:06