クライアントが特定の 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で説明されています) 。