【问题标题】:IPv4 remote address in WCFWCF 中的 IPv4 远程地址
【发布时间】:2010-01-08 16:09:33
【问题描述】:

How to get the IP address of a WCF remote endpoint?相关

我正在使用此代码在调用工作流方法时检索远程 IP 地址:

private static string GetRemoteIP()
{
  var oc = OperationContext.Current;
  var mp = oc.IncomingMessageProperties;
  var remp = mp[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;

  return remp == null ? "(unknown)" : remp.Address;
}

但是,我返回的地址是“::1”。我不想要 IPv6 地址,我想要 IPv4 地址 (127.0.0.1) - 有什么方法可以强制执行此操作?

【问题讨论】:

    标签: c# wcf tcp


    【解决方案1】:

    不,我不这么认为。您基本上只是在调用时读出客户端设置的属性。您唯一的选择是指示客户端(通过一些配置)始终使用 IPv4 而不是 IPv6(即一起关闭 IPv6)。

    我不知道有任何 WCF 设置来强制执行该设置 - 您必须深入研究网络堆栈,看看是否有任何方法可以使其使用 IPv4 地址而不是 IPv6。

    【讨论】:

      【解决方案2】:

      您看到 ::1 是因为您通过解析名称“localhost”而不是将其寻址为“127.0.0.1”来连接到服务。启用 IPv6 堆栈的现代 Windows 版本将首先使用 IPv6。

      您可以禁用 IPv6 堆栈,但这与制作鸵鸟并将头埋在沙子中大致相同。 IPv6 就在这里,人们在他们的网络上使用它,所以你的应用程序应该准备好支持它。

      【讨论】:

        【解决方案3】:

        Murat 提出的解决方法不起作用。 MSDN 说 - 如果您将 IP 地址传递给 GetHostAddresses 方法,则此地址将在数组中返回,而无需查询 DNS。 要使其正常工作,您需要先使用 GetHostEntry 方法查询主机名。然后,使用主机名,使用 GetHostAddresses。但是,即使是 GetHostEntry 也可能包含对您来说足够的地址列表。

        【讨论】:

          【解决方案4】:

          这是一种解决方法:(您可以将值存储在哈希表中以避免多次 DNS 操作)

              static string GetClientIP()
              {
                  var context = OperationContext.Current;
                  var mp = context.IncomingMessageProperties;
                  var propName = RemoteEndpointMessageProperty.Name;
                  var prop = (RemoteEndpointMessageProperty) mp[propName];
                  string remoteIP = prop.Address;
          
                  if(remoteIP.IndexOf(":") > -1)
                  {
                      IPAddress[] addresses = Dns.GetHostAddresses(remoteIP);
                      for (int i = 0; i < addresses.Length; i++)
                      {
                          if(addresses[i].ToString().IndexOf(".")>-1)
                              return addresses[i].ToString();
                      }
                      return remoteIP;
                  }
                  else
                  {
                      return remoteIP;
                  }
              }
          

          【讨论】:

          • IndexOf 将始终返回 >= -1 的结果,因此 if 将始终选择 else 分支
          • 第一个“if”语句不应该是:if(remoteIP.IndexOf(":") > -1)?
          【解决方案5】:

          您可以使用AddressFamily.InterNetwork == address.AddressFamilyAddressFamily.InterNetworkV6 作为测试,而不是寻找“:”或“。”在地址字符串中。

          【讨论】:

            猜你喜欢
            • 2012-12-25
            • 1970-01-01
            • 2017-05-01
            • 2010-09-28
            • 1970-01-01
            • 2011-01-04
            • 2016-10-17
            • 2015-01-17
            • 2013-09-18
            相关资源
            最近更新 更多