2

我们有一个使用 WAS 和 net.msmq 绑定托管在 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 的传输安全模式为无。
  • ExactlyOnce 是真的
  • UseActiveDirectory 为假
  • 耐用是真的
  • 队列地址为 net.msmq://the-host-computer-name/private/EmailAsyncService

WCF 日志记录

  • 有一个警告:

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

  • 然后出现错误:

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

我试过的

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

一些想法

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

1 回答 1

0

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

您可能想尝试启用目录服务集成,因为我认为您需要使用证书才能在工作组模式下运行。

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

于 2012-04-11T18:13:27.043 回答