我不知道我的经历是否完全符合描述的场景,但我认为它至少可以成为一种灵感。
在我的解决方案中,我有四个不同的云服务,每个都有一个 Web 角色,每个人都必须知道其他服务的 url 才能正常工作。在生产中,我确切地知道我所有服务的 url,我可以通过其域名引用每个服务。但是当需要进行调试时,这可能是一场噩梦,因为没有将云服务绑定到特定 IP 地址(和端口)的选项,并且 DevFabric 无法保证特定云服务在两个不同的调试会话之间保持相同的地址.
我用一种简单的技术解决了这个问题:
在我的 WebRoles 中,我总是提到像debug.myservice.com或debug.myotherservice.com这样的域名。
使用主机文件解析本地 IP 地址,您可以在以下位置找到:
windows/system32/drivers/etc/hosts
通过附加一些简单的语句,例如:
127.0.0.1 debug.myservice.com
127.0.0.2 debug.myotherservice.com
这解决了问题,但可能非常无聊,因为每次启动新的调试会话时都需要手动更新主机文件。
但是有一个简单而强大的解决方案。您知道您可以设置一个简单的启动脚本,该脚本在每次云服务初始化时执行,您可以在此处找到详细信息:
http://msdn.microsoft.com/en-us/library/windowsazure/hh180155.aspx
当您在云端或模拟器中运行时,您也可以运行不同的脚本。
我所做的是运行一个脚本,每次我的云服务在模拟器(并且仅在模拟器)环境中初始化时自动更新主机文件。
这里的脚本:
IF "%ComputeEmulatorRunning%" == "true" (
cd Startup
UpdateDnsHostsOnDebugEnv.exe MyCompany.MyService.Site.WebRole debug.myservice.com
cd..
)
在这里您需要添加到ServiceDefinition.csdef以便在启动时运行脚本:
<Startup>
<Task commandLine="Startup\UpdateDnsHosts.cmd" executionContext="elevated" taskType="foreground">
<Environment>
<Variable name="ComputeEmulatorRunning">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
</Environment>
</Task>
</Startup>
请注意UpdateDnsHostsOnDebugEnv.exe程序的使用。这是我编写的一个简单的控制台应用程序,它只需运行 csrun.exe 并解析结果以提取角色的本地端点地址并更新主机文件。
希望这有帮助。