3

我有一个 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>

我的主机文件中也映射了地址:

127.0.0.1   studio.mydomain.localhost
127.0.0.1   admin.mydomain.localhost

这很好用,如果我在浏览器中使用http://studio.mydomain.localhost:81/and进行测试http://admin.mydomain.localhost:81/,那么我会得到两个不同的索引页面,正如预期的那样。

但是,如果我在 Visual Studio 中按 F5,它会坚持尝试启动http://127.0.0.1:81/,这当然会导致 404 Bad Request 错误。

有什么方法可以让 VS 立即从 F5 启动正确的地址?这只是一件小事,但每次都必须重新输入地址很费时间。

而且,当我们讨论这个主题时,当我按下 F5 时,Azure 如何选择我要启动的角色?我在同一个 Azure 项目中有一个 Web 服务角色。为什么不尝试启动它?它们是我缺少的一些设置,还是全部由 ServiceDefinition.csdef 中出现的顺序控制?

我看过以下文章(以及其他文章)。虽然两者都提供了丰富的信息,但我在任何一个中都看不到答案:

http://blog.elastacloud.com/2011/01/11/azure-running-multiple-web-sites-in-a-single-webrole/

http://msdn.microsoft.com/en-us/library/windowsazure/gg433110.aspx

4

1 回答 1

3

实际上有一种解决方法可以启动所有站点(尽管您需要单击一个按钮)。首先,您需要知道如何:

  • 获取每个站点的主机头 (ServiceDefinition)
  • 获取当前端口(RoleEnvironment)
  • 获取没有主机头的站点的当前 IP (RoleEnvironment)

这是一个获取信息、聚合信息并启动 Internet Explorer 的小应用程序(您可以改进代码以跳过 TCP 端点等...):

    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));
        }
    }

现在,对于 Visual Studio 集成,转到ToolsExternal Tools并添加一个新的应用程序,并将其作为参数$(ProjectDir)

在此处输入图像描述

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

在此处输入图像描述

于 2012-10-08T19:17:22.950 回答