如何在Azure中在web角色的外部和内部端点上托管WCF服务?

如何在Azure中在web角色的外部和内部端点上托管WCF服务?,wcf,azure,wcf-binding,Wcf,Azure,Wcf Binding,我目前正在Windows Azure中的web角色上实现WCF REST服务,并尝试在该角色的实例之间添加一些通信,以便它们可以在blob存储中的某些数据更新时彼此保持更新。我想做的是在web角色的外部和内部HTTP端点上承载相同的WCF服务。然而,从我所读到的内容来看,当托管在IIS中时,WCF仅限于每个协议一个基址。当我为我的角色启用内部HTTP端点并尝试使用WebServiceHostFactory启动我的服务时,我得到的错误是: 此集合已包含一个 使用http方案的地址。有 在中,每个方

我目前正在Windows Azure中的web角色上实现WCF REST服务,并尝试在该角色的实例之间添加一些通信,以便它们可以在blob存储中的某些数据更新时彼此保持更新。我想做的是在web角色的外部和内部HTTP端点上承载相同的WCF服务。然而,从我所读到的内容来看,当托管在IIS中时,WCF仅限于每个协议一个基址。当我为我的角色启用内部HTTP端点并尝试使用WebServiceHostFactory启动我的服务时,我得到的错误是:

此集合已包含一个 使用http方案的地址。有 在中,每个方案最多只能有一个地址 这个收藏

参数名称:item

我在谷歌上搜索了一下,在不同的地方建议在web.config中添加baseAddressPrefixFilter。但是,如果在运行应用程序之前我不知道两个端点的完整URL,我不知道如何使其工作

或者,这个问题似乎仅限于IIS托管,那么是否有其他托管方法可以在Azure中使用?我认为在任何IIS上下文或其他上下文之外的自托管都不够健壮/安全,但我不确定


有人知道如何回避这个问题吗?在web角色的两个端点上托管web服务似乎是一件非常常见的事情。我对WCF比较陌生,所以可能有一些明显的地方我遗漏了。非常感谢您的帮助。

我终于在周五解决了这个问题。稍后我将尝试给出更详细的答案和/或博客,但现在,这里是我提出的解决方案的摘要:

  • 我在web.config文件中根本没有system.serviceModel部分。您可能可以通过web.config配置其中的某些部分,但对我来说,在代码中完成这一切更容易
  • 每个端点必须位于其自己的服务上。当两个端点使用相同的协议(在本例中为HTTP)并且您试图在IIS上托管时,确实没有简单的方法可以解决这一问题
  • 每个服务都必须有自己的.svc文件。我听说在IIS中托管不需要.svc文件,但如果这是真的,我还没有看到任何其他方法可以让它工作
  • 每个服务还具有自己的自定义服务主机工厂。在工厂中,在创建主机时,我使用了基址参数,该参数的端口与我想要使用的端点匹配。我被告知这个基本地址实际上并不重要,但我自己也不能保证这一点。然后在创建端点时,只需使用一个空字符串作为端点地址
  • 因为我想创建一个REST服务,我通常会使用WebServiceHost,但这会导致一些问题,所以我只使用ServiceHost,并手动将WebHttpBinding和WebHttpBehavior添加到端点
  • 最后,当从外部服务调用内部服务时,我必须确保使用新的操作上下文范围围绕调用,如下所示:
我问了a,得到了一些信息,所以那里可能有一些更有用的信息

希望这能帮助其他遇到同样问题的人


using (new OperationContextScope((IContextChannel)myClientFromChannelFactory))
{
    myClientFromChannelFactory.MyServiceMethod();
}