Debugging 在VS2012中调试时,如何让Azure emulator启动特定的主机头定义的站点?

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

我有一个Azure部署,在一个web角色上配置了两个站点,如下所示:

<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)
下面是一个小应用程序,它可以获取信息、聚合信息并启动internet explorer(您可以改进代码以跳过TCP端点等):

现在,对于Visual Studio集成,请转到工具外部工具,并添加一个新的应用程序,其中包含as参数$(ProjectDir)

最后,启动调试器后,在解决方案资源管理器中选择Windows Azure项目,转到工具,然后单击打开Azure IExplorer按钮。您甚至可以将其添加到工具栏中


否,无法指示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));
        }
    }