与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) - 以任何方式强制执行此操作?
答案 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.AddressFamily
和AddressFamily.InterNetworkV6
作为测试,而不是寻找&#34;:&#34;或&#34;。&#34;在地址字符串中。