Отримання 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
goodguys_activate

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

1
@cost "IP" у цьому випадку знаходиться не тільки в TCP-пакеті, але також знаходиться в повідомленні WCF, однак цей текст у потоці даних (рівень 7) не захищений належним чином '
goodguys_activate

1
@shambulator Минуло кілька років з того часу, як я побачив проблему, але в наступній статті KB, схоже, вказується, що це могли бути порти, а не ipaddress. support.microsoft.com/kb/971842
goodguys_activate

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
Junior Mayhé

@ makerofthings7 що ми повинні використовувати, приймаючи рішення щодо безпеки?
CSharper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.