WCF中的IPv4远程地址

10

如何获取WCF远程端点的IP地址?相关。

当工作流方法被调用时,我正在使用此代码来检索远程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)- 有没有强制获取IPv4地址的方法?

5个回答

6

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

我不知道是否有任何WCF设置来强制执行此操作 - 你需要深入了解网络堆栈并查看是否有任何方法可以使其使用IPv4地址而不是IPv6。


4
您看到的是::1,因为您通过解析名称“localhost”而不是将其作为“127.0.0.1”进行寻址来连接服务。启用IPv6堆栈的现代Windows版本将首先使用IPv6。
您可以禁用IPv6堆栈,但这基本上就像一个鸵鸟把头伸进沙子里一样。IPv6已经来了,并且人们正在他们的网络上使用它,因此您的应用程序应该准备支持它。

2
这里有一个解决方法:(你可以将值存储在哈希表中,以避免多次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分支。 - Marcel Popescu
第一个“if”语句不应该是这样吗:if(remoteIP.IndexOf(":") > -1)? - Stephen Drew

2

Murat提出的解决方法行不通。 MSDN上说-如果你将IP地址传递给GetHostAddresses方法,该地址将以数组的形式返回,而不需要查询DNS。 要使其工作,您需要首先查询主机名,使用GetHostEntry方法。然后,使用主机名,使用GetHostAddresses。但是,即使GetHostEntry可能具有足够的地址列表,这也可能对您有帮助。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接