WCF net.msmq 服务自动激活

Posted

技术标签:

【中文标题】WCF net.msmq 服务自动激活【英文标题】:WCF net.msmq service auto activation 【发布时间】:2010-11-14 17:29:01 【问题描述】:

我必须使用托管在 IIS 7 中的 net.msmq 协议的 WCF 服务。我的问题是当队列中出现新消息时服务不会激活,您必须先物理浏览到服务,然后他们将开始接收任何消息。

有没有办法自动激活这些服务?

提前感谢您的帮助

亲切的问候, 布赖恩

【问题讨论】:

我们遇到了同样的问题,我正在与 Microsoft 打一个支持电话,以查明问题的根源。我想知道是否有办法知道确切的错误或它没有激活的原因 【参考方案1】:

我的解决方案是在这里混合一些答案。 我的队列启用了身份验证,因此如果不使用身份验证,可能不需要执行某些步骤。

这是我在 Windows 2012 上执行它的步骤:

1) 安装非http激活服务WAP(https://msdn.microsoft.com/en-us/library/ms731053(v=vs.110).aspx)

2) 创建与 IIS 应用程序同名的队列,例如 private$/<WCF application>/myservice.svc

Net.Msmq Listener Adapter 服务将尝试匹配队列和 IIS 中由 VdesmedT 指定的 WCF 应用程序名称。

3) 在站点和应用程序上启用协议。

首先创建绑定:

%windir%\system32\inetsrv\appcmd.exe 设置站点“默认网站” -+bindings.[protocol='net.tcp',bindingInformation='808:*']

网站绑定应如下所示:

然后为站点启用协议net.msmq

%windir%\system32\inetsrv\appcmd.exe 设置配置 -section:system.applicationHost/sites "/[name='Default Web Site'].[path='/'].enabledProtocols":"http,net.msmq" /commit:apphost

这个命令会重写协议,所以如果你有多个http enable,你需要把它添加到命令行中。

在高级设置中,您应该会看到:

最后为应用启用协议net.msmq

%windir%\system32\inetsrv\appcmd.exe 设置应用程序“默认网站/”/enabledProtocols:http,net.tcp

应用程序的高级设置屏幕应显示与站点高级设置中启用的协议行相同的内容。

4) 授予 IIS 应用程序队列读取、查看和删除、获取属性和设置属性的权限。 默认帐户是 IIS Apppool\DefaulApp

5) 授予服务队列Net.Msmq Listener Adapter 的查看权限(默认为Network Service

应该不需要,但我必须在更改权限后重新启动。

检查:

要检查 WCF 是否设置正确,只需使用浏览 WCF 应用程序来激活它。队列中的任何消息都应该被处理。

要检查 WAS 是否正在激活 WCF 应用程序,请回收应用程序池并发送新消息。如果是 工作它应该立即处理。

【讨论】:

【参考方案2】:

只需在 IIS 中将应用程序自动启动设置为“启用”

【讨论】:

【参考方案3】:

这是因为 WAS 在使用 MSMQ 时不会自动激活或“预热”。解决方案是查看IIS 7 Warm Up module 或使用负载均衡器 ping 您的服务(我们使用 F5 设备来执行此操作)。更新 - 这是IIS 8 App Initialization的链接

【讨论】:

你的链接失效了。 IIS 8.0 应用程序初始化是替代品吗? 这个解决方案对我有用。在 IIS 7.5 中,您必须下载应用程序初始化模块作为单独安装。【参考方案4】:

我们已经在具有以下属性的系统中观察了这个问题一个多月了:

混合服务,基于 http 和 msmq 托管在 IIS7.5 上的 WAS 中 使用的 msmq 协议:net.msmq 服务不在根网站中,而是在下面的应用程序中

我们一直在运行所有指南和解决问题的技术,涉及: * iis 和应用程序级别的协议设置。 * 队列命名 * 队列、windows服务和iis的安全设置

但问题仍然存在。 我们的解决方案是遵循这个:http://www.daczkowski.net/tag/wcf/ 也就是将appfabric安装到我们的iis上并设置自动启动服务。

问题本身很难完全定义,只能说“有时服务会停止从队列中处理”

【讨论】:

【参考方案5】:

我发现,在带有 IIS 7.5 和 .NET 4.0 的 Windows 7 上,NetMsmqActivator 服务默认被禁用和停止。您需要启用它并启动它。

此外,队列必须允许应用程序池使用的帐户和NetMsmqActivator使用的帐户“接收消息”和“查看消息”。在默认安装中,您可以使用 IIS APPPOOL\ASP.NET v4.0(您必须输入:这是 3 个“P”,注意空格)和 NETWORK SERVICE

【讨论】:

【参考方案6】:

我知道这是一篇旧帖子,但万一其他人遇到这个问题......

如果应用程序池关闭后服务没有激活,很可能是因为队列名称与服务 URI 不匹配,因此 WAS 不知道要激活哪个应用程序。

例如,如果您在默认网站中创建应用程序“服务”并拥有 FirstService.svc,则队列名称应为 private$\Services/FirstService.svc

[编辑:队列名称也应包含应用程序名称的复数形式]

【讨论】:

好的 - 我已经确认这是可行的。问题:如果应用程序是自己的站点,即不在默认网站下,队列应该命名为什么?【参考方案7】:

Tom Hollander 的博客上有一个非常棒的三部分系列文章,介绍了如何让 WCF、MSMQ 和 IIS 启动并运行并很好地协同工作:

MSMQ, WCF and IIS: Getting them to play nice (Part 1) MSMQ, WCF and IIS: Getting them to play nice (Part 2) MSMQ, WCF and IIS: Getting them to play nice (Part 3)

也许这些会有帮助?如果一切配置正确,托管在 IIS7 中的 MSMQ 肯定会自动获取 WCF 消息。

有一些设置不是开箱即用的 - 请参阅第 1 部分。您可能需要添加和启用其他 Windows 功能,并且可能需要运行 appcmd.exe 工具来配置 WAS(Windows 激活服务器, IIS7 的一部分) 来自动处理非 http 请求。

马克

【讨论】:

以上是关于WCF net.msmq 服务自动激活的主要内容,如果未能解决你的问题,请参考以下文章

MSMQ 在 Azure 上是不是可用

调用 WCF 服务时 JSONP 自动完成失败

从现有 API 自动生成服务器端 WCF 服务

WCF 中 MSI 包的自动更新

无法启动net.msmq listener adapter服务是怎么解决

WCF服务引用之后自动生成的泛型代理类名称太长的解决方案