C# Azure:与完整IIS的WebRole内部通信(netTcpBinding)
我需要在Windows Azure项目中动态更改一些配置设置,这些设置需要通过web服务调用进行更改(此处不允许通过平台api或Azure管理站点更新应用程序的配置) 该项目有多个web和worker角色—所有这些角色都需要在新配置发生更改时了解新配置 配置被持久化到持久存储,并且在运行时也缓存在静态变量中 我的解决方案是在我的角色上创建一个内部(tcp)端点,并使用该端点在这些角色中的所有角色和实例之间循环,动态创建一个客户端,并将新设置告知该实例。(几乎与:) 起初,我在WebRole的RoleEntryPoint中启动了一个ServiceHost。。。我很困惑,当我通过通信时,为什么一切似乎都正常工作(静态变量设置正确)-然而当我调用其他Web服务时,静态变量似乎“忘记”了我设置的内容 本地和Azure登台环境都是如此 此时我意识到,因为我们使用的是完整的IIS模式,RoleEntryPoint和Web服务在两个单独的进程中运行——一个在Azure的存根中,另一个在IIS中 “没问题”我说,我只需将启动ServiceHost的代码行从我的RoleEntryPoint移到global.asax,此时ServiceHost将与站点的其余部分在相同的过程中启动,静态变量将是相同的 这就是我遇到的问题;这在dev环境中运行的本地机器上非常有效。一旦我部署到登台,我就会收到错误电子邮件,说用于连接服务的通道无法关闭,因为它处于“故障状态” 问题:C# Azure:与完整IIS的WebRole内部通信(netTcpBinding),c#,wcf,azure,nettcpbinding,azure-web-roles,C#,Wcf,Azure,Nettcpbinding,Azure Web Roles,我需要在Windows Azure项目中动态更改一些配置设置,这些设置需要通过web服务调用进行更改(此处不允许通过平台api或Azure管理站点更新应用程序的配置) 该项目有多个web和worker角色—所有这些角色都需要在新配置发生更改时了解新配置 配置被持久化到持久存储,并且在运行时也缓存在静态变量中 我的解决方案是在我的角色上创建一个内部(tcp)端点,并使用该端点在这些角色中的所有角色和实例之间循环,动态创建一个客户端,并将新设置告知该实例。(几乎与:) 起初,我在WebRole的Ro
- 造成这种情况的Azure与开发环境有什么不同
- 我如何解决这个问题
- 有没有人对我应该如何获得更具描述性的错误有什么一般性的建议。。。我是否必须在Azure中启用完整的wcf诊断才能获取此信息,或者是否有其他方法可以获取异常详细信息
- 默认情况下,Azure WebRoles上未安装非HTTP激活。我相信这可以通过启动脚本来克服: start/w pkgmgr/iu:WCF非HTTP激活
- 默认情况下,web角色在IIS中创建的网站未启用net.tcp协议。我也相信这可以通过启动脚本来克服: %systemroot%\system32\inetsrv\appcmd.exe设置应用程序“此处的网站名称”/enabledProtocols:https、http、net.tcp
我在让HTTP在登台过程中的实例之间工作时经历了一段痛苦的时光,当我看起来需要处理
netsh
以允许我的进程通过HttpListener进行监听时,我放弃了(嘘!)。所以我通过套接字切换到TCP。HTTP只是在这样的点到点通信场景中增加了开销。更新(2011年6月27日):
令人惊讶的是,微软的某个人(我在他的博客上发表了评论)居然给了我一个答案
Azure和WCF团队更新了此帖子:
该链接包含您进行此操作所需的所有信息
非常感谢亚弗·格奥尔基耶夫,MSFT的首相,他赢得了比赛
我问这个问题已经有一段时间了,没有答案,所以让我留下这个: 根据我在这篇文章中的后续报道,有几种方法可以让这一切顺利进行。。。但它们很复杂,很难实施 对于工作者角色,netTcpBinding工作得非常好。这里没有问题。去用它吧 对于WEB角色,您会遇到一些问题。但是,您需要使用netTcpBinding来公开内部端点。怎么办 好吧,我是这么做的:
- 使用ServiceHost在RoleEntryPoint中启动netTcpBinding服务
- 在您的web角色中使用SOAP/JSON/创建标准WCF服务
- 当您通过netTcpBinding接收请求时,将它们代理到环回适配器上的WCF服务李>
- 使用SSL客户端证书正确保护“内部”WCF服务李>
显然,YMMV 我不知道这个问题的解决方案是什么,但我遇到了一些非常相似的事情:也许我很困惑。我正在使用NetCPBinding。。。不是HTTP。你说你“通过套接字切换到TCP”。。。你能举一个例子,说明你是如何做到这一点的,并让ServiceHost与你正在运行的IIS托管的.NET应用程序交互的吗?我可能应该把我的回答作为评论发布,因为实际上我只是想分享我在角色之间的通信方式。我在Global.asax.cs内的Application_start中启动一个线程。它使用低级套接字API接收来自工作者角色的消息,工作者角色也使用低级套接字API。也就是说,可能尝试不使用WCF。