为什么我的Azure公共IP没有显示在Dns.GetHostAddresses中?

时间:2018-03-30 00:58:54

标签: c# azure dns azure-virtual-machine

我正在尝试在Azure VM上设置自定义服务器。我已经为它分配了一个公共IP地址,我可以通过远程桌面访问并进入服务器,因此该部分工作正常。

但是当我尝试使用the websocket-sharp library绑定到公共IP地址时,它失败了,说“主机部分不是本地主机名。”

我已将其跟踪到this file,执行以下代码块,最后返回false:

  var host = System.Net.Dns.GetHostName ();
  var addrs = System.Net.Dns.GetHostAddresses (host);
  foreach (var addr in addrs) {
    if (address.Equals (addr))
      return true;
  }

return false;

通过一些调试,我确定Dns.GetHostAddresses仅显示内部IP,但不显示外部IP地址。我在Azure中配置了IP地址并将其连接到服务器,我在网络配置中启用了IP转发并重新启动了VM,但服务器仍然无法识别自己的外部IP。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

  

我错过了什么?

您可以使用本地计算机主机名测试 Dns.GetHostAddresses ,它也可以获取内部 ip,它与Azure VM无关。

如果我们想要使用主机名获取Azure VM的公共IP,我们可以使用Azure SDK来执行此操作。

我还做了一个示例演示来获取公共IP。在此之前,我们需要注册Azure AD并为注册的App分配相应的角色。关于如何注册Azure AD并创建信用文件,您可以引用另一个SO thread和此link

var subscriptiondId = "subscription Id";
var credentials =  SdkContext.AzureCredentialsFactory.FromFile(@"path of creditial file");
var resouceGroup = "resouce group";
var hostName = "host name";
NetworkManagementClient networkManagement = new NetworkManagementClient(credentials) { SubscriptionId = subscriptiondId };
ComputeManagementClient computeManagement =
new ComputeManagementClient(credentials) {SubscriptionId = subscriptiondId};
var nic = computeManagement.VirtualMachines.GetAsync(resouceGroup, hostName).Result.NetworkProfile.NetworkInterfaces
            .FirstOrDefault();
var networkIntefaceName = nic?.Id.Split('/').Last();
var ipConfiguration  = networkManagement.NetworkInterfaces.GetAsync(resouceGroup, networkIntefaceName).Result.IpConfigurations.FirstOrDefault();
var publicIpAddressId = ipConfiguration?.PublicIPAddress.Id;
var ip = networkManagement.PublicIPAddresses.GetAsync(resouceGroup, publicIpAddressId?.Split('/').Last()

enter image description here