Связанный с тем, Как получить IP-адрес удаленной конечной точки WCF?
Я использую этот код для получения удаленного 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.
Вот обходной путь: (Вы можете сохранить значения в хэш-таблице, чтобы избежать множественных операций 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;
}
}
Вы видите :: 1, потому что вы подключаетесь к службе, разрешая имя «localhost» вместо адресации «127.0.0.1». Современные версии Windows, в которых включен стек IPv6, сначала будут использовать IPv6.
Вы можете отключить стек IPv6, но это примерно то же самое, что походить на страуса и сунуть голову в песок. IPv6 уже здесь, и люди используют его в своих сетях, поэтому ваше приложение должно быть готово к его поддержке.