WCF远程MSMQ - 我可以写入远程队列,但无法接收

时间:2012-07-21 22:37:11

标签: wcf msmq

jobsServer:Windows Server 2008 R2 .NET版本:4.5

我正在使用WCF连接两台服务器 - app queue 。我希望应用能够从队列发送/接收消息。出于某种原因,应用程序可以发送消息,但无法接收消息。

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   并且运行时,队列存在并具有要读取的适当授权   从。内部异常可能包含其他信息。 ---&GT;   System.ServiceModel.MsmqException:打开时出错   queue:队列不存在或者您没有足够的队列   权限执行操作。 (-1072824317,0xc00e0003)。该   消息无法从队列中发送或接收。确保MSMQ是   安装并运行。还要确保队列可以打开   具有所需的访问模式和授权。在   System.ServiceModel.Channels.MsmqQueue.OpenQueue()at   System.ServiceModel.Channels.MsmqQueue.GetHandle()at   System.ServiceModel.Channels.MsmqQueue.SupportsAccessMode(字符串   formatName,Int32 accessType,MsmqException&amp; msmqException)---结束   内部异常堆栈跟踪--- at   System.ServiceModel.Channels.MsmqVerifier.VerifyReceiver(MsmqReceiveParameters   receiveParameters,Uri listenUri)at   System.ServiceModel.Channels.MsmqTransportBindingElement.BuildChannelListener [TChannel](的BindingContext   上下文)   System.ServiceModel.Channels.Binding.BuildChannelListener [TChannel](URI   listenUriBaseAddress,String listenUriRelativeAddress,ListenUriMode   listenUriMode,BindingParameterCollection参数)at   System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(布尔   actualCreate,Type [] supportedChannels,Binding binding,   BindingParameterCollection参数,Uri listenUriBaseAddress,   String listenUriRelativeAddress,ListenUriMode listenUriMode,   ServiceThrottle油门,IChannelListener&amp;结果,布尔值   supportContextSession)at   System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo   东西,ServiceHostBase serviceHost,Uri listenUri,ListenUriMode   listenUriMode,Boolean supportContextSession,IChannelListener&amp;   结果)在   System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription   description,ServiceHostBase serviceHost)at   

的System.ServiceModel.ServiceHostBase.InitializeRuntime()

我已经在StackOverflow和互联网上待了8个小时。这就是我所做的:

  • 确保ANONYMOUS LOGIN,Everyone,网络,网络服务和本地服务具有完全控制权
  • 停止了远程MSMQ服务器并观察了WCF服务的作用,我得到了一个不同的错误 - 所以我确定启动时的WCF服务是与MSMQ服务器对话
  • 在两个方框上禁用了Windows防火墙,并通过EC2安全组打开了所有端口
  • 在注册表中将AllowNonauthenticatedRpc和NewRemoteReadServerAllowNoneSecurityClient设置为1
  • 在两台服务器上配置了MS DTC(队列是事务性的,但无论队列是否是事务性的,我都会得到相同的错误)
  • 确认如果我使用本地队列,WCF服务器启动正常,并且收到没有问题

帮助!!!如果没有远程排队解决方案,我无法扩展我的应用程序。

2 个答案:

答案 0 :(得分:1)

您的帖子哪个层无法读取,更重要的是哪个队列,这一点尚不清楚。

但是,不支持以事务方式读取远程队列:

  

消息队列支持向远程队列发送事务性消息,但不支持从事务中的远程队列中读取消息。这意味着远程队列无法提供可靠,准确的一次接收。请参阅   Reading Messages from Remote Queues

我怀疑即使你提到你禁用它,你的系统仍会在某处执行事务性远程读取。

从最佳实践的角度来看,即使你让它发挥作用,你的设计也不会扩展,因为它是你想要的东西。

  

远程读取是一个高开销,因此效率低下的过程。在应用程序中包含远程读取操作会限制扩展。 1

你应该远程写 而不是远程阅读。

更好的方法是插入message broker路由器服务,作为消息传递的中心点。您的应用队列服务(顺便说一句令人困惑的名称)应仅从其本地队列中以事务方式读取

  • 应用应以交易方式阅读本地队列
  • 应用应以交易方式发送至远程经纪人
  • 代理以事务方式读取本地队列
  • 经纪人以事务方式发送到远程队列

同样,如果您的队列层要回复,则会发生上述相反的过程。

稍后,如果您希望提高性能,可以引入Dynamic router,根据动态规则集或环境条件(如压力级别)将消息重定向到另一台计算机上的其他远程队列。

答案 1 :(得分:0)

从MSMQ 4.0(Windows Server 2008)开始支持远程事务读取。如果您遇到此问题,请务必结帐https://msdn.microsoft.com/en-us/library/ms700128(v=vs.85).aspx