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

82

Очевидно, вы можете легко получить IP-адрес клиента в WCF 3.5, но не в WCF 3.0. Кто-нибудь знает как?

Газ
источник

Ответы:

152

Это не поможет вам в версии 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;
Пол Мрозовски
источник
11
Я не мог редактировать пост, но это мне очень помогло, спасибо! Хотел упомянуть, что есть 2 ошибки. Должен быть «OperationContext» вместо «OperationContent» и должен быть «RemoteEndpointMessageProperty» вместо «RemoveEndpointMessageProperty».
Джереми Маллин,
3
Примечание по безопасности: это значение можно подделать ... см. MSDN
halfbit,
@ makerofthings7 Я вижу это в MSDN, но можно ли его подделать? У запроса все еще есть подтверждение TCP. Если IP-адрес действительно был подделан, не будет ли синхронизация отправлена ​​не в то место, и, следовательно, соединение прервется еще до того, как оно начнется?
стоимость
1
@cost «IP» в этом случае находится не только в пакете TCP, но также находится в сообщении WCF, однако этот текст в потоке данных (уровень 7) не защищен должным образом »
полубит
1
@shambulator Прошло несколько лет с тех пор, как я увидел проблему, но следующая статья в базе знаний, похоже, указывает, что это могли быть порты, а не ip-адреса. support.microsoft.com/kb/971842
Halfbit,
36

Оказывается, вы можете, если (а) ваша служба размещается в веб-службе (очевидно) и (б) вы включаете режим AspNetCompatibility, как показано ниже:

    <system.serviceModel>
            <!-- this enables WCF services to access ASP.Net http context -->
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
...
    </system.serviceModel>

И тогда вы можете получить IP-адрес:

HttpContext.Current.Request.UserHostAddress
Газ
источник
11
А потом вы получите это с помощьюHttpContext.Current.Request.UserHostAddress
Jader Dias
3
Имейте в виду, что это влечет за собой целый ряд проблем
виду, что это влечет user1496062
15

Можно, если вы ориентируетесь на .NET 3.0 SP1.

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


источник
3
Хорошо, похоже, я получаю IPv6 вроде "fe80 :: 3dbc: a2ec". Я бродил, как мне получить удаленный IP-номер
Джуниор Мэйхе
@ makerofthings7 что нам следует использовать при принятии решений по безопасности?
CSharper