Azure-在阶段中动态发现服务web角色url

Azure-在阶段中动态发现服务web角色url,azure,azure-configuration,Azure,Azure Configuration,我正在考虑将现有应用程序移动到Azure。它将在一个web角色中有一个MVC应用程序,在另一个web角色中有一些WCF服务。现场直播时,网站将在http://www.myapp.com服务将在http://api.myapp.com将MVC应用程序配置为指向http://api.myapp.com 问题在于将应用程序推送到Azure上的“阶段”配置时。我的理解是,每个推送阶段都会导致服务位于一个新的url(类似http://4aa5ae2071324585ba5a902f4242a98c.clo

我正在考虑将现有应用程序移动到Azure。它将在一个web角色中有一个MVC应用程序,在另一个web角色中有一些WCF服务。现场直播时,网站将在
http://www.myapp.com
服务将在
http://api.myapp.com
将MVC应用程序配置为指向
http://api.myapp.com

问题在于将应用程序推送到Azure上的“阶段”配置时。我的理解是,每个推送阶段都会导致服务位于一个新的url(类似
http://4aa5ae2071324585ba5a902f4242a98c.cloudapp.net/
)。在这种情况下,我的MVC应用程序发现服务url的最佳方式是什么

一个选项是设置一个dns条目,如
http://stage.api.myapp.com
并更新我的DNS CNAME记录,使其在每次推送到后台时指向新的Azure后台url,但是。。。恶心

另一种选择是推到stage,获取服务的新url,将RDC连接到MVC角色的每个实例,并手动更新配置。也很恶心


有没有一个简单的方法可以做到这一点?我知道我可以用PowerShell之类的工具自动化上面的一些步骤,但我真的希望Azure框架中有一些东西可以让这变得简单。这似乎是一个标准场景。

动态发现登台URL的唯一方法是让实例检查自己的deploymentID。我在这里假设MVC网站和WCF服务处于同一部署中。如果检查roleenEnvironment.DeploymentID,您会发现它与登台中使用的“随机”URL完全对应(即http://[DeploymentID].cloudapp.net)

只要您在客户端动态创建ChannelFactory,它就应该能够获取自己的DeploymentID并找到登台URL


当然,这只有在登台部署时才有用。为什么不直接使用生产槽呢?该名称是稳定的,您可以依赖它或为其设置的CNAME(更有可能)。您可以始终拥有多个托管服务(开发、质量保证、产品等),只需在其上使用生产槽即可。

不要按照@dunnry的建议去做!Azure有一个非常好的解决问题的端点概念。您可以从RoleEnvironment类访问此信息

您可以看看我的博客文章,其中的关键部分是创建一个WCF服务正在侦听的内部端点。但是请记住,您不一定需要一个新角色来完成此任务,而且就个人而言,我更愿意将其托管在IIS中,与原始Web角色一起&使用其中两个角色以提高可靠性


这样,部署是什么并不重要,因为服务通信将在部署内部进行,无论是登台还是生产。

注意:对于api.myapp.com,您需要设置一个主机绑定站点,并为www.myapp.com执行类似的操作。但它们仍然可以是同一部署的一部分。谢谢链接。不幸的是,为了使我的问题保持简单,我似乎遗漏了一条关键信息:(.事实上,MVC站点和Silverlight项目都在使用这些服务。我相信这意味着在我的情况下,使用您建议的方法是行不通的。或者有没有一种方法可以在面向公众的服务中使用类似的方法?Silverlight客户永远不会有机会知道DeploymentID或访问这些服务内部端点。这是一个惯例。但是对于内部通信,请使用我编写的内容。对于SL项目,我将在编译时决定指向一个登台DNS(角色始终响应的地方)或一个生产DNS名称(例如api.myapp.net)。如果不使用其他方法(例如AppFabric),我看不到任何其他方法。这不是一个好的做法!对于角色之间的通信,您需要使用端点,这些端点仅用于此目的。很抱歉,我投了反对票,但我真的觉得重要的是不要按照您建议的方式进行此操作。我觉得您错过了问题。这是如何动态发现临时槽。只有两种方法(我概述的一种,使用mgmt API)-这就是我所回答的。如果可能的话,我并不反对使用interrole通信是一个好主意,但有时人们确实需要使用负载平衡器地址,他没有澄清。我理解你的意思,但有时答案不是正确的做法。我的意思是,如果我问你如何将处理器和moth粘在一起Board你能告诉我吗,或者你更愿意告诉我,我可以把它放在那里,用已经就位的机制将它固定住……DeploymentId不应该被“滥用”,我真的感觉到了答案(虽然正确!)除非您完全了解原因和正在做的事情,并且已经使用了所有其他选项,否则不应使用。此外,如果您使用外部端点,您需要为流量付费!正如我提到的(海报所示),有时您确实需要负载平衡端点。但是,对于SL客户端,您必须在带外告诉他们,因为他们不在部署中,并且不知道deploymentID。正如我所建议的,只需使用具有稳定名称(或者更可能将其映射到您自己的CNAME)的生产插槽即可。您可以为每个环境创建更多托管服务,而不必使用暂存槽。请使用
RoleEnvironment.CurrentroleInstance.InstanceEndpoints
,每个端点都有一个协议和一个可用于创建URL的IPEndpoint。筛选非“http”或“https”的协议,创建如下URL:
endpoint.protocol+://”+endpoint.IPEndpoint.ToString()+“/”