我们有一个使用 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 进行查找。