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

时间:2012-05-25 02:48:00

标签: c# wcf azure

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

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

什么应该是基础Uri(Scheme,servername&amp; port):

  1. 职员角色
  2. 网络角色
    • 外部端点
    • 内部终点。 (出于性能原因,某些服务需要相互交谈后面负载均衡器,但是如何?)
  3. 这些也是可能的:

    1. 每个网络角色有多个服务主机。
    2. 改变端点绑定即。我想在Http上使用一个servicehost,另一个是Net.tcp,如果需要,我需要在部署时在csdef文件中声明这两个协议,还是可以按需编程添加它们(又名。后期绑定)?
    3. 由于$$$原因,我正在寻找一种不涉及ServiceBus的解决方案。

1 个答案:

答案 0 :(得分:4)

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

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

内部端点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并走过工作者角色沟通动手实验室,该实验室进入有关设置ServiceHost的详细信息,包括输入端点和内部端点。