如何在Azure上以编程方式托管WCF服务

7
我想在Azure上托管一个WCF服务,但这个实例化必须是动态的,所以我希望在需要时实例化新的服务,然而...
在以下情况下,什么是基础URI(方案、服务器名和端口)?:
1. 工作角色 2. Web 角色 - 外部终结点 - 内部终结点。(某些服务需要在负载均衡器后面相互通信,以提高性能。但如何实现?)
另外,以下内容是否可能:
1. 每个 Web 角色上有多个 ServiceHost。 2. 不同的终结点绑定,例如我想在 Http 上使用一个 ServiceHost,在 Net.Tcp 上使用另一个 ServiceHost。如果可以,我是否需要在部署时在 csdef 文件中声明这两个协议,或者可以按需以编程方式添加它们(即“后期绑定”)?
由于价格问题,我正在寻找一种不涉及 ServiceBus 的解决方案。
1个回答

4
无论是Web角色还是Worker角色实例,方法都是相同的,因为它们本质上都是Windows 2008 Server(只是Web角色运行IIS,这也会消耗一些端口)。您想要将WCF服务挂在哪个端口,只需将其定义为输入端点(每个端口一个端点),并确定哪个角色处理该端点。
只要有可用端口,您就可以拥有多个ServiceHosts。您当前限制为每个部署25个总输入端点和25个总内部端点,因此这是您的绝对限制。当然,如果启用了RDP,则可用端口数会减少。关于协议:如果您想同时使用http和tcp,则需要定义两个端点,因为协议是在端点定义中定义的。
内部端点WCF服务基本相同,但您可以放弃安全性并选择net.tcp进行快速传输。不过,在负载平衡方面有一个区别:
- 挂在输入端点上的WCF服务将在角色的所有实例之间进行负载平衡 - 挂在内部端点上的WCF服务将不会进行负载平衡。

对于后一种情况:假设您的Web角色需要与Worker角色的内部端点上的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培训套件并完成“Worker Role Communication”实践实验,该实验详细介绍了如何设置ServiceHost以及使用输入端点和内部端点。


我明白你的意思。如果可以再问几个问题,我该如何遍历所有实例?你能告诉我类的名称吗?此外,在“RoleInstanceEndpoint”类中,我没有看到任何可帮助我区分内部和外部端点的属性。 - Alwyn
1
我编辑了我的答案,展示了枚举角色端点的示例。您需要知道您的端点名称 - 没有特定的指示告诉您是内部端点还是输入端点。 - David Makogon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接