6

クライアントが特定の WorkerRole インスタンスと通信できるようにしたいので、InstanceInput エンドポイントを使用しようとしています。

私のプロジェクトは、この質問で提供されている例に基づいています: Azure InstanceInput endpoint usage

RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint; 問題は、ローカル ポート (例: 10.xxx:10100) で内部アドレスを取得するだけで、実際のインスタンスの外部 IP アドレス + ポートを取得できないことです。DNS ルックアップ (xxx.cloudapp.net) を介してパブリック IP アドレスを取得できることはわかっていますが、各インスタンスの正しいパブリック ポートを取得する方法がわかりません。

考えられる解決策の 1 つは、(から) インスタンス番号を取得し、このインスタンス番号を最小値 (例: 10106)RoleEnvironment.CurrentRoleInstance.Idに追加することです。FixedPortRangeこれは、最初のインスタンスが常にポート 10106 を持ち、2 番目のインスタンスが常に10107 を持つということを意味します。Windows Azure がインスタンスをポートに割り当てる方法がわからないので、この解決策は少しハックに思えます。

各インスタンスのパブリック ポートを取得するより良い (正しい) 方法はありますか?

質問 2: InstanceInput エンドポイントをサポートする Azure Compute Emulator に関する情報はありますか? (コメントで既に述べたように: Azure Compute Emulator は現在 InstanceInputEndpoint をサポートしていないようです)。

2番目の解決策(はるかに優れています)

パブリック ポートを取得するには、PublicIPEndpointプロパティを使用できます (そもそもこのプロパティに気付かなかった理由がわかりません)。

使用法:RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].PublicIPEndpoint;

警告: プロパティの IP アドレスは使用されていません ( http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleinstanceendpoint.publicipendpoint.aspx )。

最初の解決策:

'artfulmethod' で既に述べたように、REST 操作Get Deploymentは現在の展開に関する興味深い情報を取得します。ちょっと厄介な「問題」に遭遇したので、ここで REST クライアントのコードを提供します (他の誰かが同様の問題を抱えている場合に備えて)。

X509Store certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certificateStore.Open(OpenFlags.ReadOnly);

string footPrint = "xxx"; // enter the footprint of the certificate you use to upload the deployment (aka Management Certificate)
X509Certificate2Collection certs = 
certificateStore.Certificates.Find(X509FindType.FindByThumbprint, footPrint, false); 
if (certs.Count != 1) {
    // client certificate cannot be found - check footprint
}
string url = "https://management.core.windows.net/<subscription-id>/services/hostedservices/<service-name>/deployments/<deployment-name>"; // replace <xxx> with actual values
try {
  var request = (HttpWebRequest)WebRequest.Create(url);
  request.ClientCertificates.Add(certs[0]);
  request.Headers.Add("x-ms-version", "2012-03-01"); // very important, otherwise you get an HTTP 400 error, specifies in which version the response is formatted
  request.Method = "GET";

  var response = (HttpWebResponse)request.GetResponse(); // get response

  string result = new StreamReader(response.GetResponseStream()).ReadToEnd() // get response body
} catch (Exception ex) {
  // handle error
}

文字列「result」には、展開に関するすべての情報が含まれます (XML の形式については、セクション「応答本文」@ http://msdn.microsoft.com/en-us/library/windowsazure/ee460804.aspxで説明されています) 。

4

1 に答える 1

1

ロール インスタンスの VIP やパブリック ポートなど、デプロイに関する情報を取得するには、Service Management API でGet Deployment 操作を使用します。応答本文にはInstanceInputListが含まれます。

于 2012-10-24T20:18:20.530 に答える