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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
82
0
63 753
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это не поможет вам в версии 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;

Я не мог редактировать пост, но это мне очень помогло, спасибо! Хотел упомянуть, что есть 2 ошибки. Должно быть «OperationContext» вместо «OperationContent» и должно быть «RemoteEndpointMessageProperty» вместо «RemoveEndpointMessageProperty».

Jeremy Mullin 14.10.2009 08:19

Примечание по безопасности: это значение можно подделать ... см. MSDN

halfbit 08.03.2012 02:06

@ makerofthings7 Я вижу это в MSDN, но можно ли его подделать? У запроса все еще есть рукопожатие TCP. Если IP-адрес действительно был подделан, не будет ли синхронизация отправлена ​​не в то место, и, следовательно, соединение прервется еще до того, как оно начнется?

cost 20.05.2013 13:02

@cost «IP» в этом случае находится не только в пакете TCP, но также находится в сообщении WCF, однако этот текст в потоке данных (уровень 7) не защищен должным образом »

halfbit 20.05.2013 16:05

@ makerofthings7 Если я вас правильно понимаю, IP-адрес извлекается не из заголовка TCP, а из самого сообщения WCF?

cost 20.05.2013 23:34

@cost Да. Кроме того, это мое понимание и опыт работы со службами WCF, размещенными за адресом NAT.

halfbit 21.05.2013 00:27

@ makerofthings7 У вас есть документация, подтверждающая это, например конкретный заголовок, из которого эти поля взяты? Мне очень странно, что эта информация дублируется выше в стеке связи.

anton.burger 20.06.2013 14:18

@shambulator Прошло несколько лет с тех пор, как я увидел проблему, но следующая статья в базе знаний, похоже, указывает, что это могли быть порты, а не IP-адреса. support.microsoft.com/kb/971842

halfbit 20.06.2013 17:42

что вы можете сделать, если первая строка, когда вы получите OperationContext.Current, вернет null, что в настоящее время является моей проблемой

Franck 18.02.2014 23:35
Ответ принят как подходящий

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

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

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

HttpContext.Current.Request.UserHostAddress

И тогда вы получите это с помощью HttpContext.Current.Request.UserHostAddress

Jader Dias 09.03.2010 21:16

Имейте в виду, что это влечет за собой целый ряд проблем.

user1496062 08.12.2014 07:47

Можно, если вы ориентируетесь на .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

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

Junior Mayhé 24.07.2009 05:21

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

CSharper 13.01.2014 00:59

Другие вопросы по теме