我希望我的客户端与特定的 WorkerRole 实例进行通信,因此我正在尝试使用 InstanceInput 端点。
我的项目基于此问题中提供的示例:Azure InstanceInput endpoint usage
问题是我没有获得实际实例的外部 IP 地址 + 端口,使用时RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint;
我只获得带有本地端口的内部地址(例如 10.xxx:10100)。我知道我可以通过 DNS 查找 (xxx.cloudapp.net) 获取公共 IP 地址,但我不知道如何为每个实例获取正确的公共端口。
一种可能的解决方案是:获取实例编号(从RoleEnvironment.CurrentRoleInstance.Id
)并将此实例编号添加到FixedPortRange
最小值(例如 10106)。这意味着第一个实例将始终具有端口 10106,第二个实例始终具有10107,依此类推。这个解决方案对我来说似乎有点 hacky,因为我不知道 Windows Azure 如何将实例分配给端口。
是否有更好(正确)的方法来检索每个实例的公共端口?
问题 #2:是否有关于支持 InstanceInput 终结点的 Azure Compute Emulator 的任何信息?(正如我在评论中已经提到的:Azure Compute Emulator 目前似乎不支持 InstanceInputEndpoint)。
第二种解决方案(好多了):
要获取公共端口,可以使用 porperty PublicIPEndpoint
(我不知道为什么我一开始没有注意到这个属性)。
用法:RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].PublicIPEndpoint;
警告:属性中的 IP 地址未使用 ( http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.roleinstanceendpoint.publicipendpoint.aspx )。
第一个解决方案:
正如已经提到的“巧妙方法”,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
}
字符串“结果”包含有关部署的所有信息(XML 的格式在“响应正文”@ http://msdn.microsoft.com/en-us/library/windowsazure/ee460804.aspx部分中描述)