【问题标题】:WCF Remote MSMQ - I can write to a remote queue, but cannot receiveWCF 远程 MSMQ - 我可以写入远程队列,但无法接收
【发布时间】:2012-07-20 17:39:16
【问题描述】:

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

我正在使用 WCF 连接两台服务器 - appqueue。我希望 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 并运行,队列存在并具有适当的读取权限 从。内部异常可能包含附加信息。 ---> System.ServiceModel.MsmqException:打开时出错 queue:队列不存在或者你没有足够的 执行操作的权限。 (-1072824317, 0xc00e0003)。这 无法从队列发送或接收消息。确保 MSMQ 是 安装并运行。还要确保队列可以打开 具有所需的访问模式和授权。在 System.ServiceModel.Channels.MsmqQueue.OpenQueue() 在 System.ServiceModel.Channels.MsmqQueue.GetHandle() 在 System.ServiceModel.Channels.MsmqQueue.SupportsAccessMode(字符串 formatName, Int32 accessType, MsmqException& msmqException) --- 结束 内部异常堆栈跟踪 --- 在 System.ServiceModel.Channels.MsmqVerifier.VerifyReceiver(MsmqReceiveParameters 接收参数,Uri listenUri)在 System.ServiceModel.Channels.MsmqTransportBindingElement.BuildChannelListener[TChannel](BindingContext 上下文)在 System.ServiceModel.Channels.Binding.BuildChannelListener[TChannel](Uri listenUriBaseAddress,字符串 listenUriRelativeAddress,ListenUriMode listenUriMode,BindingParameterCollection 参数)在 System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(布尔 实际上创建,Type[] supportedChannels,Binding 绑定, BindingParameterCollection 参数,Uri listenUriBaseAddress, 字符串 listenUriRelativeAddress、ListenUriMode listenUriMode、 ServiceThrottle 油门,IChannelListener& 结果,布尔值 supportContextSession) 在 System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo 东西,ServiceHostBase serviceHost,Uri listenUri,ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& 结果)在 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription 描述,ServiceHostBase 服务主机)在 System.ServiceModel.ServiceHostBase.InitializeRuntime() 在

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

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

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

【问题讨论】:

  • 使用服务器名称时出现此错误。使用 ip 时我没有收到错误,但我没有成功从远程私有队列中读取。
  • 我也有同样的问题,配置相似,但我没有通过网络联系。 “app”可以写入队列(这是本地的)但不能从它接收(即使它是本地的)。我不相信网络连接本身与问题有任何关系。

标签: wcf msmq


【解决方案1】:

从你的帖子中不清楚哪个层无法读取,更重要的是哪个队列

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

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

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

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

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

您应该始终远程写入 远程读取。

更好的方法是插入一个message broker路由器服务 作为消息传递的中心点。您的 appqueue 服务(顺便说一下混淆了名称)应该只是从它们的本地队列中以事务方式读取

  • app 应该以事务方式读取它的 本地队列
  • app 应该以事务方式发送到远程 broker
  • 代理以事务方式读取本地队列
  • broker 以事务方式发送到远程 queue

类似地,如果您的队列层想要回复上述相反的过程。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 2013-06-22
      • 2011-09-12
      • 1970-01-01
      • 2019-05-28
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多