6

我希望我的客户端与特定的 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部分中描述)

4

1 回答 1

1

要获取有关您的部署的信息,包括您的角色实例的 VIP 和公共端口,请使用服务管理 API 上的获取部署操作。响应正文包括一个InstanceInputList

于 2012-10-24T20:18:20.530 回答