我需要在 Windows Azure 项目中即时更改一些配置设置 - 并且它们需要通过 Web 服务调用进行更改(通过平台 api 或 Azure 管理站点更新应用程序的配置不是这里的选项)。
该项目有多个 web 和 worker 角色——所有这些角色都需要在更改时了解新配置。
配置被持久化到持久存储中,并且在运行时也被缓存在一个静态变量中。
我的解决方案是在我的角色上创建一个内部 (tcp) 端点,并使用它来遍历这些角色中的所有角色和实例,动态创建客户端,并告诉实例有关新设置的信息。(几乎等同于:http: //msdn.microsoft.com/en-us/gg457891)
起初,我在 WebRole 的 RoleEntryPoint 中启动了一个 ServiceHost ......我很困惑为什么当我逐步完成通信(静态变量设置正确)时一切似乎都工作正常 - 但是当我进行其他 web 服务调用时,静态变量似乎已经“忘记”了我设置的内容。
在本地和 Azure 暂存环境中都是这种情况。
此时我意识到,因为我们使用的是完整的 IIS 模式,所以 RoleEntryPoint 和 Web 服务在两个独立的进程中运行——一个在 Azure 的存根中,一个在 IIS 中。
“没问题”我说,我只需将启动 ServiceHost 的代码行从我的 RoleEntryPoint 移动到 global.asax 中 - 此时 ServiceHost 将在与站点其余部分相同的过程中启动 -并且静态变量将是相同的。
这是我遇到问题的地方;这在我在开发环境中运行的本地机器上效果很好。一旦我部署到登台,我就开始收到错误电子邮件,说用于连接到服务的通道无法关闭,因为它处于“故障状态”。
问题:
- 导致此问题的 Azure 与开发环境有何不同?
- 如何修复或解决问题?
- 有没有人对我应该如何获得更具描述性的错误有任何一般性建议...我是否必须在 Azure 中启用完整的 wcf 诊断才能获得此信息,还是有其他方法可以获得异常详细信息?
跟进:
通过远程桌面,我学到了一些有趣的东西:
默认情况下,Azure WebRoles 上不安装非 HTTP 激活。我相信这可以通过启动脚本来克服:
开始 /w pkgmgr /iu:WCF-NonHTTP-Activation;
Web 角色在 IIS 中创建的网站默认未启用 net.tcp 协议。我也相信这可以通过启动脚本来克服:
%systemroot%\system32\inetsrv\appcmd.exe 设置应用程序“此处的网站名称”/enabledProtocols:https,http,net.tcp
我没有时间一直这样做,因为截止日期迫使我暂时实施一些变通办法。
与此主题相关的一些有用链接:
http://msdn.microsoft.com/en-us/magazine/cc163357.aspx
http://forums.iis.net/t/1160443.aspx