Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure:与完整IIS的WebRole内部通信(netTcpBinding)_C#_Wcf_Azure_Nettcpbinding_Azure Web Roles - Fatal编程技术网

C# Azure:与完整IIS的WebRole内部通信(netTcpBinding)

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

我需要在Windows Azure项目中动态更改一些配置设置,这些设置需要通过web服务调用进行更改(此处不允许通过平台api或Azure管理站点更新应用程序的配置)

该项目有多个web和worker角色—所有这些角色都需要在新配置发生更改时了解新配置

配置被持久化到持久存储,并且在运行时也缓存在静态变量中

我的解决方案是在我的角色上创建一个内部(tcp)端点,并使用该端点在这些角色中的所有角色和实例之间循环,动态创建一个客户端,并将新设置告知该实例。(几乎与:)

起初,我在WebRole的RoleEntryPoint中启动了一个ServiceHost。。。我很困惑,当我通过通信时,为什么一切似乎都正常工作(静态变量设置正确)-然而当我调用其他Web服务时,静态变量似乎“忘记”了我设置的内容

本地和Azure登台环境都是如此

此时我意识到,因为我们使用的是完整的IIS模式,RoleEntryPoint和Web服务在两个单独的进程中运行——一个在Azure的存根中,另一个在IIS中

“没问题”我说,我只需将启动ServiceHost的代码行从我的RoleEntryPoint移到global.asax,此时ServiceHost将与站点的其余部分在相同的过程中启动,静态变量将是相同的

这就是我遇到的问题;这在dev环境中运行的本地机器上非常有效。一旦我部署到登台,我就会收到错误电子邮件,说用于连接服务的通道无法关闭,因为它处于“故障状态”

问题:

  • 造成这种情况的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。