【发布时间】:2012-03-18 08:38:50
【问题描述】:
我们有一个使用 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 进行查找。
【问题讨论】:
标签: msmq was netmsmqbinding workgroup