2012-07-21 34 views
3

jobsServer:在Windows Server 2008 R2 .NET版本:4.5WCF遠程MSMQ - 我可以寫一個遠程隊列,但不能接收

我使用WCF連接兩臺服務器 - 應用隊列。我想要應用程序能夠發送/接收來自隊列的消息。出於某種原因,應用可以發送消息,但無法接收它們。

的netMsmq結合的模樣:

<binding name="JobExecutionerBinding" receiveErrorHandling="Move"> 
    <security> 
    <transport msmqAuthenticationMode="None" msmqProtectionLevel="None" /> 
    </security> 
</binding> 

與服務綁定的樣子:

現在,客戶端綁定的樣子:

<endpoint address="net.msmq://queue/private/jobs" 
      binding="netMsmqBinding" 
      bindingConfiguration="JobExecutionerBinding" 
      contract="JobExecution.Common.IJobExecutionService" 
      name="SimpleEmailService" 
      kind="" 
      endpointConfiguration=""/> 

我改變了一些爲了安全起見,名字。

因此,WC客戶端可以發送到遠程隊列沒有問題。它甚至可以正確排隊傳出的消息,並在遠程隊列服務器關閉的情況下稍後轉發它。但每次啓動WCF服務時,我都會得到:

打開隊列時發生錯誤。確保安裝了MSMQ 並正在運行,該隊列已存在,並有適當的權限可從 中讀取。內部異常可能包含其他信息。 ---> System.ServiceModel.MsmqException:打開 隊列時發生錯誤:隊列不存在或您沒有足夠的 許可權執行操作。 (-1072824317,0xc00e0003)。無法從隊列發送或接收 消息。確保安裝並運行MSMQ 。還要確保隊列可用於以所需的訪問模式和授權打開 。在 System.ServiceModel.Channels.MsmqQueue.OpenQueue()在 System.ServiceModel.Channels.MsmqQueue.GetHandle()在 System.ServiceModel.Channels.MsmqQueue.SupportsAccessMode(字符串 FORMATNAME,的Int32存取類型,MsmqException & msmqException) - - 內部異常堆棧跟蹤的結尾 ---在 System.ServiceModel.Channels.MsmqVerifier.VerifyReceiver(MsmqReceiveParameters receiveParameters,烏里listenUri)在 System.ServiceModel.Channels.MsmqTransportBindingElement.BuildChannelListener [TChannel](的BindingContext 上下文)在 System.ServiceModel.Channels.Binding.BuildChannelListener [TChannel](Uri listenUriBaseAddress,String li stenUriRelativeAddress,ListenUriMode listenUriMode,BindingParameterCollection參數)在 System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(布爾 actuallyCreate,類型[] supportedChannels,裝訂裝訂, BindingParameterCollection參數,烏里listenUriBaseAddress, 字符串listenUriRelativeAddress,ListenUriMode listenUriMode, ServiceThrottle油門,IChannelListener &結果,布爾 supportContextSession)在 System.ServiceModel.Description.DispatcherBuilder。BuildChannelListener在 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription 描述,ServiceHostBase ServiceHost的)(StuffPerListenUriInfo 東西,ServiceHostBase ServiceHost的,烏里listenUri,ListenUriMode listenUriMode,布爾supportContextSession,IChannelListener & 結果)在 System.ServiceModel.ServiceHostBase .InitializeRuntime()

我已經遍佈了8個小時的StackOverflow和互聯網。下面是我做了什麼:

  • 確保了匿名登錄,每個人,網絡,網絡服務和本地服務擁有完全控制
  • 停止遠程MSMQ服務器和觀察到的WCF服務做什麼,我也得到不同的錯誤 - 所以我敢肯定,當啓動WCF服務說話的MSMQ服務器
  • 禁用Windows防火牆在兩個盒子,並通過EC2安全組
  • 集AllowNonauthenticatedRpc和NewRemoteReadServerAllowNoneSecurityClient在打開的所有端口1註冊表
  • 在兩臺服務器上都配置了MS DTC(隊列是事務性的,但無論隊列是否事務性,我都會得到相同的錯誤)
  • 確認WCF服務器啓動正常,如果我使用本地隊列並接收沒有問題

幫助!!!如果沒有遠程排隊解決方案,我無法擴展應用程序。

+0

使用服務器名稱時出現此錯誤。當使用IP時,我沒有收到錯誤,但是我沒有成功從遠程專用隊列讀取數據。 – Hadas 2013-03-04 10:05:36

+0

我有類似的配置,但我沒有通過網絡伸出同樣的問題。 「app」可以寫入隊列(這是本地的),但不能從它接收(即使它是本地的)。我不相信網絡連接本身與問題有任何關係。 – 2013-11-14 21:04:20

回答

1

從你的帖子哪一層看不懂,更重要的是哪個隊列不清楚。

然而,讀取遠程隊列事務不被支持:

消息隊列支持發送事務處理消息到遠程隊列,但事務內不支持從遠程隊列讀取消息。這意味着可靠的一次接收不能從遠程隊列中獲得。Reading Messages from Remote Queues

我懷疑是某處系統仍在執行事務處理遠程即使你提到你禁用它讀取。

從最佳實踐的角度來看,即使你使用它,你的設計也不會縮放,這是一種恥辱,因爲它是你提到的你想要的東西。

遠程閱讀是一個高開銷,因此效率低下的過程。在應用程序中包含遠程讀取操作會限制縮放。1

你應該總是遠程寫遠程讀取。

更好的方法是插入一個message broker路由器服務作爲消息的中心點。您的應用程序隊列服務(通過這種方式混淆名稱)應該只從從其本地隊列事務讀取。

  • 應用應事務讀它的本地隊列
  • 應用應事務發送到遠程經紀人
  • 經紀人事務讀取本地隊列
  • 經紀人事務發送到遠程隊列

類似地,如果您的隊列層希望的逆過程回覆上面會發生。

如果您希望提高性能,您可以引入一個Dynamic router,它可以根據動態規則集或環境條件(如壓力級別)將消息重定向到另一臺計算機上的其他遠程隊列。

相關問題