如何在 azure 上以编程方式托管 wcf 服务

Posted

技术标签:

【中文标题】如何在 azure 上以编程方式托管 wcf 服务【英文标题】:How to host wcf service programmatically on azure 【发布时间】:2012-05-31 15:35:09 【问题描述】:

我想在 Azure 上托管一个 wcf 服务,但是这个实例化必须是动态的,所以我想根据需要实例化新服务......

new ServiceHost(new Service(),<<What the heck is the base URI!?>>)

什么应该是基础 Uri(方案、服务器名称和端口):

    工人角色 网络角色 外部端点 内部端点。 (出于性能原因,一些服务需要在负载均衡器之后相互通信,但如何?)

这些也是可能的:

    每个 Web 角色有多个服务主机。 不同的端点绑定,即。我想要一个服务主机在 Http 上,另一个 Net.tcp 如果需要,我需要在部署时在 csdef 文件中声明这两个协议,还是我可以根据需要以编程方式添加它们(又名后期绑定)?

出于 $$$ 的原因,我正在寻找不涉及 ServiceBus 的解决方案。

【问题讨论】:

【参考方案1】:

无论是在 Web Role 还是 Worker Role 实例上,方法都是相同的,因为它们本质上都是 Windows 2008 Server(只是 Web Role 运行 IIS,这也消耗了一些端口)。无论您想在哪个端口上挂起 wcf 服务,只需将它们定义为输入端点(每个端口一个端点),并决定哪个角色处理该端点。

只要您有可用的端口,您就可以拥有多个 ServiceHost。当前每个部署的输入端点总数为 25 个,内部端点总数为 25 个,因此这是您的绝对限制。当然,如果启用 RDP,可用端口数会下降。哦:关于协议:如果你想要 http 和 tcp,你需要定义两个端点,因为协议是用 Endpoint 定义定义的。

内部端点 WCF 服务几乎相同,但您可以取消安全性并使用 net.tcp 进行快速传输。负载平衡的一个区别:

挂在输入端点上的 WCF 服务将在所有角色实例之间实现负载平衡 挂在内部端点上的 WCF 服务将进行负载平衡。

对于后一种情况:假设您的 Web 角色需要与内部端点上的 Worker Role 的 WCF 服务通信。您需要枚举所有实例,获取每个实例的 IP+端口,然后随机选择一个(或循环,或您选择的任何方法)。这是一个从给定角色和给定端点名称返回随机端点实例的示例方法(代码借用自 Michael Washam 的 blog):

private String GetRandomServiceIP(String roleName, String endPointName)

    var endpoints = RoleEnvironment.Roles[roleName].Instances.Select(i => i.InstanceEndpoints[endPointName]).ToArray();
    var r = new Random(DateTime.Now.Millisecond);
    int ipIndex = r.Next(endpoints.Count());
    return endpoints[ipIndex].IPEndpoint.Address.ToString();

至于设置 WCF 服务和相关 URI,我强烈建议获取最新的 Windows Azure Training Kit 并通过 Worker Role Communication 动手实验,该实验涉及很多有关设置具有输入端点和内部端点的 ServiceHost 的详细信息。

【讨论】:

我明白你在说什么。如果我可以再问几个,我将如何遍历所有实例?你能说出班级的名字吗?此外,我没有看到任何可以帮助我区分“RoleInstanceEndpoint”类中的内部端点和外部端点的属性 我编辑了答案以显示枚举角色端点的示例。您需要知道端点名称 - 没有任何具体信息可以告诉您是内部端点还是输入端点。 谢谢你,这就是我想要的。感谢您的宝贵时间!

以上是关于如何在 azure 上以编程方式托管 wcf 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?

发布后在 Azure 云服务中托管的 WCF 服务错误

使用 Azure 应用服务中托管的 WCF 服务时出现凭据错误

将 WCF SOAP 和 WCF REST 服务托管为 Azure 应用服务

在 Azure 中托管 WCF 和可扩展性怎么样?

如何在CSP的Partner Center API上以编程方式创建Azure订阅?