Debugging 在VS2012中调试时,如何让Azure emulator启动特定的主机头定义的站点?
我有一个Azure部署,在一个web角色上配置了两个站点,如下所示:Debugging 在VS2012中调试时,如何让Azure emulator启动特定的主机头定义的站点?,debugging,azure,visual-studio-2012,emulation,Debugging,Azure,Visual Studio 2012,Emulation,我有一个Azure部署,在一个web角色上配置了两个站点,如下所示: <WebRole name="Studio" vmsize="Small"> <Sites> <Site name="Studio" physicalDirectory="..\Studio"> <Bindings> <Binding name="HttpIn" endpointName="HttpIn" hostHe
<WebRole name="Studio" vmsize="Small">
<Sites>
<Site name="Studio" physicalDirectory="..\Studio">
<Bindings>
<Binding name="HttpIn" endpointName="HttpIn" hostHeader="studio.mydomain.localhost" />
</Bindings>
</Site>
<Site name="Admin" physicalDirectory="..\Admin">
<Bindings>
<Binding name="HttpIn" endpointName="HttpIn" hostHeader="admin.mydomain.localhost" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="HttpIn" protocol="http" port="80" />
</Endpoints>
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
</WebRole>
如果我在浏览器中使用http://studio.mydomain.localhost:81/
和http://admin.mydomain.localhost:81/
,然后我得到了两个不同的索引页,正如预期的那样
但是,如果我在Visual Studio中点击F5,它会坚持尝试启动http://127.0.0.1:81/
,这当然会导致404错误请求
有没有办法让VS立即从F5启动正确的地址?这只是一件小事,但每次都要重新键入地址是很费时的
而且,当我们讨论这个问题时,Azure如何选择在我点击F5时启动我的哪些角色?我在同一Azure项目中有一个web服务角色。为什么它不试着启动呢?它们是我缺少的一些设置,还是全部由ServiceDefinition.csdef中的显示顺序控制
我看了以下文章(除其他外)。虽然这两种方法都提供了信息,但我看不出这两种方法的答案:
实际上,启动所有站点都有一个变通方法(不过您需要单击一个按钮)。首先,您需要知道如何:
- 获取每个站点的主机头(ServiceDefinition)
- 获取当前端口(RoleEnvironment)
- 获取没有主机头的站点的当前IP(RoleEnvironment)
否,无法指示visual studio打开浏览器的地址。至于其他角色-Windows Azure工具将启动项目中的所有角色,但是web浏览器仅为web角色打开,而不为其他类型的角色打开。Astaykov-感谢您提供的信息。@Astaykov-您想将其作为答案,以便我可以接受吗?这似乎是正确的。谢谢,您可以添加评论并尝试Sandrino purposed;)的解决方法
127.0.0.1 studio.mydomain.localhost
127.0.0.1 admin.mydomain.localhost
static void Main(string[] args)
{
var document = System.Xml.Linq.XDocument.Load(Path.Combine(args[0], "ServiceDefinition.csdef"));
var siteBindings = from binding in document.Descendants()
where binding.Name.LocalName == "Binding"
select new
{
Role = binding.Parent.Parent.Parent.Parent.Attribute("name").Value,
EndpointName = binding.Attribute("endpointName").Value,
HostHeader = binding.Attribute("hostHeader") != null ? binding.Attribute("hostHeader").Value : null
};
var endpoints = RoleEnvironment.Roles.SelectMany(o => o.Value.Instances)
.SelectMany(o => o.InstanceEndpoints);
foreach (var siteBinding in siteBindings)
{
var endpoint = endpoints.FirstOrDefault(o => o.Value.RoleInstance.Role.Name == siteBinding.Role);
Process.Start("iexplore.exe", String.Format("{0}://{1}:{2}", endpoint.Value.Protocol, siteBinding.HostHeader ?? endpoint.Value.IPEndpoint.Address.ToString(), endpoint.Value.IPEndpoint.Port));
}
}