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

时间:2010-01-26 20:37:18

标签: wcf azure wcf-binding

我目前正在Windows Azure中的Web角色上实现WCF REST服务,我正在尝试在角色的实例之间添加一些通信,这样他们就可以在比较某些数据时保持彼此更新在blob存储中更新。我想要做的是在Web角色的外部和内部HTTP端点上托管相同的WCF服务。但是,根据我的阅读,在IIS中托管时,WCF仅限于每个协议只有一个基址。当我为我的角色启用内部HTTP端点并尝试使用WebServiceHostFactory启动我的服务时,这是我得到的错误:

  

此集合已包含   地址与方案http。有可以   每个计划最多一个地址   这个系列。

     

参数名称:item

我用Google搜索了一下,the one workaround I've seen在各个地方建议在web.config中添加baseAddressPrefixFilter。但是,如果在运行应用程序之前我不知道任一端点的完整URL,我不知道如何使其工作。

或者,这个问题似乎只限于IIS托管,所以我可以在Azure中使用一些其他托管方法吗?我认为在任何IIS上下文之外的自托管或任何不够强大/安全的东西,但我不确定。

有谁知道如何解决这个问题?想要在Web角色的两个端点上托管Web服务似乎是很常见的事情。我对WCF比较陌生,所以可能会有一些我不知道的东西。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我终于在星期五弄明白了。我稍后会尝试提供更详细的答案和/或博客,但就目前而言,这里是我提出的解决方案的摘要:

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

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

我问similar question on the MSDN Windows Azure forums并获得了一些信息,因此可能会有更多有用的信息。

希望能帮助那些遇到同样问题的其他人。