WCF中的IPv4远程地址

时间:2010-01-08 16:09:34

标签: c# wcf tcp

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) - 以任何方式强制执行此操作?

5 个答案:

答案 0 :(得分:4)

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

我不知道任何WCF设置强制执行 - 您必须深入了解网络堆栈,看看是否有办法让它使用IPv4地址而不是IPv6。

答案 1 :(得分:3)

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

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

答案 2 :(得分: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;
        }
    }

答案 3 :(得分:2)

穆拉特提出的解决方法是行不通的。 MSDN说 - 如果您将IP地址传递给GetHostAddresses方法,则该地址将在不查询DNS的情况下以数组形式返回。 要使其正常工作,您需要首先使用GetHostEntry方法查询主机名。然后,使用主机名,使用GetHostAddresses。但是,即使GetHostEntry也可能包含足够的地址列表。

答案 4 :(得分:0)

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