我有一个有2个Web角色的Azure项目(一个Azure网站项目和一个Azure WCF服务角色)。WCF服务由Azure网站项目使用,并使用"添加服务引用"选项进行引用。该网站使用web中定义的URL。配置连接到WCF服务,它在本地开发/Azure计算模拟器中工作良好。在我的本地开发机器上,当我运行解决方案时,服务&在IIS Express中加载和执行的网址为"http://127.0.0.1:8080/v1"。Svc"one_answers"http://127.0.0.1:81/"。
然而,当我在Azure云服务上发布应用程序时,它分别为网站和服务创建了一个单独的机器/VM/实例(因为它们被认为是两个不同的角色)。
现在我的问题是,因为Azure在运行时为实例分配IP,我应该如何动态地改变URL(在网站的web.config)和更新WCF服务,使网站无缝地使用WCF服务?
感谢您的宝贵时间。
谢谢,恋人。
感谢您的回复。我尝试了解决方案,但得到一个404错误。在我的情况下,webrole名称是"TimeSheetUI",当我试图使用"timesheetui.cloudapp.net:8080"访问服务时,它抛出404错误。但是,如果我尝试使用http://e214d16594be4e31abfbf0488b5d612b.cloudapp.net:8080/timesheetservices.svc访问它,它的工作原理。我希望我不需要添加任何CNAME条目与DNS等,使其工作。
然而,我尝试了编程选项在运行时构建URL,服务端点的类型选项设置为"内部"。
var endpoints = RoleEnvironment.Roles["TimeSheetService"].Instances.Select(i => i.InstanceEndpoints["TimeSheetService.EndPoint"]).ToArray();
var r = new Random();
EndpointAddress endPointAddress = new EndpointAddress(String.Format("http://{0}/TimeSheetService.svc", endpoints[r.Next(endpoints.Count() - 1)].IPEndpoint));
var factory = new ChannelFactory<TimeSheetProxy.ITimeSheet>("BasicHttpBinding_ITimeSheet");var client = factory.CreateChannel(endPointAddress);TimeSheetUI.TimeSheetProxy.TimeSheet[] ts = client.DisplayTimeSheets();
上面的代码工作正常,没有问题。但我不确定这是否是一种优雅的完成方式!
找到上述解决方案@ http://lab.studiopesec.com/azure-applications-101-part-ii/
在ServiceConfig文件中指定服务的端点/端口:
<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
<WebRole name="WCFServiceRole">
…
<Endpoints>
<InputEndpoint name="HttpIn" protocol="http" port="8080" localPort="8080" />
</Endpoints>
</WebRole>
<WebRole name="MyWebRole">
…
<Endpoints>
<InputEndpoint name="HttpIn" protocol="http" port="80" localPort="80" />
</Endpoints>
</WebRole>
…
</ServiceDefinition>
然后在你的网上。配置,使用Azure DNS和端口指定WCF端点(即mywebrole.cloudapp.net:8080
)有关更多信息,请参考-在Windows Azure中使用WCF指南