3

次のように、1 つの Web ロールに 2 つのサイトが構成された Azure デプロイがあります。

<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>

また、hosts ファイルにマップされたアドレスもあります。

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

これは問題なく動作し、ブラウザで と を使用してテストするhttp://studio.mydomain.localhost:81/http://admin.mydomain.localhost:81/、予想どおり 2 つの異なるインデックス ページが表示されます。

しかし、Visual Studio で F5 キーを押すと、起動しようとすることをhttp://127.0.0.1:81/要求され、もちろん 404 Bad Request エラーが発生します。

F5 からすぐに VS に正しいアドレスを起動させる方法はありますか? ちょっとしたことですが、毎回住所を打ち直さなければならないのは時間がかかります。

また、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 プロジェクトを選択し、 [ツール] に移動して [ Azure 用の IExplorer を開く] ボタン をクリックします。ツールバーに追加することもできます。

ここに画像の説明を入力

于 2012-10-08T19:17:22.950 に答える