Получить IP-адрес клиента для WCF, после операции

Я пытаюсь определить IP-адрес клиента по следующей ссылке: http://www.danrigsby.com/blog/index.php/2008/05/21 / get-the-client-address-in-wcf /

В .Net 3. клиент подключается к сервису WCF. В .Net 3.5 новое свойство было представил называется RemoteEndpointMessageProperty. Это свойство дает вы IP-адрес и порт, что клиентское соединение вошло в сервис на. Получить эту информацию довольно просто. Просто вытяните его из свойства IncomingMessageProperties текущего OperationContext с помощью RemoteEndpointMessageProperty.Name и доступа Свойства адреса и порта.

> [ServiceContract] public interface IMyService {
>     [OperationContract]
>     string GetAddressAsString(); }
> 
> public class MyService : IMyService {
>     public string GetAddressAsString()
>     {
>         RemoteEndpointMessageProperty clientEndpoint =
>             OperationContext.Current.IncomingMessageProperties[
>             RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
> 
>         return String.Format(
>             "{0}:{1}",
>             clientEndpoint.Address, clientEndpoint.Port);
>     } } 

Следует отметить:

  1. Это свойство работает только для транспортов http и tcp. На все остальные транспорты, такие как MSMQ и NamedPipes, это свойство не будет доступный.
  2. Адрес и порт сообщаются сокетом или http.sys. машины службы. Так что, если клиент пришел через VPN или какой-то другой прокси, который изменил адрес, этот новый адрес будет представляется вместо локального адреса клиента. Это желательно и важно, потому что это адрес и порт, который служба видит клиента как, а не как видит себя клиент. Это также означает что там может быть какая-то подделка. Клиент или что-то в между клиентом и сервером может подделать адрес. Итак, не используйте адрес или порт для любых решений безопасности, если вы не добавите в некоторые другие таможенные механизмы проверки.
  3. Если вы используете дуплекс на вашем сервис, то не только сервис будет заполнять это свойство для клиента, но у клиента также будет заполнено это свойство для службы для каждого вызова из этой службы.

У меня есть операции Контракты WebInvoke / Post и WebGet. Код работает, когда клиентский запрос является WebGet. Но когда клиентский запрос является WebInvoke, я получу IP-адрес хоста WCF. Любое решение? Спасибо.

Вот интерфейс

[OperationContract]
[WebGet(UriTemplate = RestTemplate.hello_get)]
Stream hello_get();

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = RestTemplate.hello_post)]
Stream hello_post();

// Code for getting IP
private string getClientIP()
{
    //WebOperationContext webContext = WebOperationContext.Current;

    OperationContext context = OperationContext.Current;

    MessageProperties messageProperties = context.IncomingMessageProperties;

    RemoteEndpointMessageProperty endpointProperty =

    messageProperties[RemoteEndpointMessageProperty.Name]

    as RemoteEndpointMessageProperty;
    return endpointProperty.Address;
}

public Stream hello_get()
{
    string ip = getClientIP();
    ...
}

public Stream hello_post()
{
    string ip = getClientIP();
    ...
} 

12
задан flayn 31 March 2014 в 12:45
поделиться