NetMsmqBinding WAS服务无法从工作组中的远程MSMQ队列中读取消息

时间:2012-02-28 20:37:20

标签: msmq was netmsmqbinding workgroup

我们使用带有net.msmq绑定的WAS在IIS中托管服务。该服务从私有事务MSMQ队列中读取消息。我需要通过从与服务不同的机器上的队列中读取来工作。如果队列在同一台机器上,我可以使它工作,但如果它在不同的机器上则不行。

环境信息

  • 服务器正在运行Windows Web Server 2008 R2。
  • 服务器位于工作组中,即它们不属于域。
  • 已安装MSMQ而没有目录服务集成功能。
  • 我相信已安装所需的Windows功能(WCF非Http激活和Http激活,消息队列服务器,多播支持,消息队列DCOM代理,Windows进程激活服务,.NET环境,配置API)
  • 我在计算机上进行了以下注册表更改:
    • NewRemoteReadServerAllowNoneSecurityClient = 1
    • NewRemoteReadServerDenyWorkgroupClient = 0
    • AllowNonauthenticatedRpc = 1
  • 已启用DTC,具有网络DTC访问权限,允许远程客户端,允许入站,允许出站,无需身份验证以及启用所有选定的SNA LU 6.2事务。
  • 已进行防火墙更改。

服务配置信息

  • 我们正在使用netMsmqBinding。
  • netMsmqBinding的传输安全模式为None。
  • ExactlyOnce是真的
  • UseActiveDirectory为false
  • 耐用是真的
  • 队列地址为net.msmq:// the-host-computer-name / private / EmailAsyncService

WCF记录

  • 有警告:
  

无法检测队列是否为事务性“。错误中队列的FormatName为DIRECT = OS:-host-computer-name \ private $ \ EmailAsyncService

  • 然后出现错误:
  

转换'the-host-computer-name \ private $ \ EmailAsyncService'>时发生错误队列路径名称为格式名称:无法识别的错误-1072824300(0xc00e0014)。排队通道上的所有操作都失败了。确保队列地址有效。必须在启用Active Directory集成的情况下安装MSMQ,并且可以访问它。

我尝试了什么

  • 如果我手动创建并使用MessageQueue实例,我可以从服务所在的机器上读取远程队列中的消息。
  • 我尝试将该服务作为独立的控制台应用程序托管。错误消息是相同的。
  • 我尝试禁用所涉及的防火墙。
  • 我尝试了http://msdn.microsoft.com/en-us/library/ms752246.aspx上的更改,这些更改与在加入工作组的计算机上运行此类服务有关。 (“必须使用特定用户帐户运行激活服务和工作进程(两者必须相同),并且队列必须具有特定用户帐户的ACL ...在工作组中,服务还必须使用不受限制的运行令牌。“)我目前使用的用户帐户是网络服务。

一些想法

  • 我认为没有防火墙或权限问题。
  • 尽管服务配置将UseActiveDirectory设置为false,但net.msmq:// the-host-computer-name / private / EmailAsyncService的队列地址似乎已转换为主机名\ private $ \ EmailAsyncService,其中AFAIK是一种名称格式,需要通过Active Directory进行查找。

1 个答案:

答案 0 :(得分:0)

我在这里有点晚了,但由于你没有其他答案,我可能仍然会有所帮助。

您可能想尝试启用目录服务集成,因为我认为您需要使用证书来处理工作组模式。

此外,Juval Lowy的WCF书籍清楚地表明,当您在WAS中托管排队服务时,您必须将队列命名为与svc文件的虚拟路径完全相同。因此,如果您的服务实际上是在/EmailAsyncService/EmailService.svc上托管的,那么您正好需要为您的队列命名(没有第一个斜杠)。