Ответ 1
Используйте Dns.GetHostName(), потому что гораздо лучше получить имя компьютера, чем IP-адрес хоста. Рассмотрим случай, когда ваш хост-компьютер имеет более одного IP-адреса, имеет виртуальные сетевые карты (VMWare).
У меня есть служба WCF, которая размещается через IIS на нескольких веб-серверах. У меня есть метод ведения журнала, который регистрирует вызовы в базе данных, и я хотел бы зарегистрировать, на каком сервере выполняется этот вызов.
Кто-нибудь знает, как получить имя или IP-адрес хоста, на котором выполняется вызов WCF?
Используйте Dns.GetHostName(), потому что гораздо лучше получить имя компьютера, чем IP-адрес хоста. Рассмотрим случай, когда ваш хост-компьютер имеет более одного IP-адреса, имеет виртуальные сетевые карты (VMWare).
Это то, что сработало для нас. Убедитесь, что у вас есть ссылка на System.ServiceModel. Затем выполните следующий код в вашем методе обслуживания:
var context = System.ServiceModel.OperationContext.Current;
RemoteEndpointMessageProperty property = (RemoteEndpointMessageProperty)context.IncomingMessageProperties[RemoteEndpointMessageProperty.Name];
string externalIP = property.Address;
Dns.GetHostName() - это то, что я использую больше всего.
Environment.MachineName
делает то же самое, что
Имя хоста DNS не работает, потому что многие серверы имеют несколько имен хостов, и вы не знаете, на какую службу вызывали. IIRC, IIS может вызывать различные веб-службы на основе того, какое имя хоста было указано, что делает ситуацию хуже. использование .Current отлично, если вы не используете один экземпляр, и в этом случае у вас всегда есть ненулевой объект-контекст, что является моим случаем для всего вышеперечисленного. Если у кого-то есть что-то более прочное, поделитесь:)
Вы можете использовать следующий код для получения текущего базового адреса сервера (хоста).
using System.ServiceModel;
var baseAddress = OperationContext.Current.Host.BaseAddresses[0].Authority;