WCF中的IPv4远程地址

与如何获取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而不是IPv6(即一起关闭IPv6)。

我不知道任何WCF设置强制执行 – 您必须深入了解网络堆栈并查看是否有任何方法可以使其使用IPv4地址而不是IPv6。

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

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

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

这是一个解决方法:(您可以将值存储在哈希表中以避免多个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; } } 

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