#wcf
Вопрос:
Очевидно, вы можете легко получить IP-адрес клиента в WCF 3.5, но не в WCF 3.0. Кто-нибудь знает, как это сделать?
Ответ №1:
Это не поможет вам в версии 3.0, но я просто вижу, как люди задают этот вопрос и расстраиваются, потому что пытаются получить IP-адрес клиента в версии 3.5. Итак, вот некоторый код, который должен работать:
using System.ServiceModel;
using System.ServiceModel.Channels;
OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;
Комментарии:
1. Я не мог отредактировать сообщение, но оно мне очень помогло, спасибо! Хотел отметить, что есть 2 ошибки. Должно быть «OperationContext» вместо «OperationContent» и должно быть «RemoteEndpointMessageProperty» вместо «RemoveEndpointMessageProperty».
2. Примечание по безопасности: Это значение может быть подделано… см. MSDN
3. @makerofthings7 Я вижу это на MSDN, но может ли это действительно быть подделкой? Запрос все еще имеет TCP-рукопожатие. Если IP-адрес действительно был подделан, не будет ли syn ack отправлен не в то место, и, следовательно, соединение прервется еще до того, как оно начнется?
4. @стоимость «IP» в этом случае находится не только в пакете TCP, но и в сообщении WCF, однако этот текст в потоке данных (уровень 7) не защищен должным образом’
5. @shambulator Прошло несколько лет с тех пор, как я видел эту проблему, но в следующей статье в КБ, похоже, указано, что это могли быть порты, а не ip-адреса. support.microsoft.com/kb/971842
Ответ №2:
Оказывается, вы можете, если (а) ваша служба размещается в веб-службе (очевидно) и (б) вы включаете режим совместимости с Aspnet, как показано ниже:
<system.serviceModel>
<!-- this enables WCF services to access ASP.Net http context -->
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
...
</system.serviceModel>
А затем вы можете получить IP-адрес с помощью:
HttpContext.Current.Request.UserHostAddress
Комментарии:
1. А затем вы получите это с помощью
HttpContext.Current.Request.UserHostAddress
2. Имейте в виду, что это влечет за собой целый ряд проблем
Ответ №3:
Вы можете, если вы нацелены на .NET 3.0 с пакетом обновления 1.
OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;
Реквизиты:
http://blogs.msdn.com/phenning/archive/2007/08/08/remoteendpointmessageproperty-in-wcf-net-3-5.aspx
Комментарии:
1. Хорошо, похоже, я получаю IPv6 типа «fe80::3dbc:a2ec». Я блуждал, как я мог получить удаленный IP-номер
2. @makerofthings7 что мы должны использовать при принятии решений о безопасности?