Получение IP-адреса клиента в WCF 3.0

#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

Ссылка: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.remoteendpointmessageproperty.aspx

Комментарии:

1. Хорошо, похоже, я получаю IPv6 типа «fe80::3dbc:a2ec». Я блуждал, как я мог получить удаленный IP-номер

2. @makerofthings7 что мы должны использовать при принятии решений о безопасности?