четверг, 27 ноября 2014 г.

Как получить IP-адрес клиента в WCF-сервисе.

Если вам нужно узнать с какого адреса приходит обращение к вашему WCF-сервису, то сделать это вы можете несколькими способами в зависимости от версии .Net Framework. Давайте по порядку.
В версии 3.0 (то есть, самая первая версия .Net, в которой стала доступна WCF) по заверениям Microsoft не существует гарантированного способа это сделать.  В принципе, если сервис хостится на IIS, то можно попробовать пару извращений, типа получения IP-адреса клиента из логов сервера (хотя встает вопрос как определять какая из записей лога соответствует текущему запросу). В общем, предлагаю придерживаться позиции Microsoft по этому вопросу ;)
В версии .Net 3.5 в WCF появляется класс  System.ServiceModel.OperationContext, так что подключаем сборку  System.ServiceModel и используем вот такой код, который и вернет на IP клиента:

            OperationContext context = OperationContext.Current;
            MessageProperties prop = context.IncomingMessageProperties;
            RemoteEndpointMessageProperty endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            //получаем IP клиента.
            string ipAddr = endpoint.Address;


Альтернативно, если вы не собираетесь использовать протоколы то отличные от HTTP, То можно использовать другой, более простой способ. Для этого достаточно класс, реализующий ваш сервис, пометить аттрибутом AspNetCompatibilityRequirements:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

Теперь ваш WCF-сервис будет использовать весь конвейер ASP.NET со всеми вытекающими последствиями. То есть, вы легко можете получит IP адрес клиента с помощью HttpContext.Current.Request.UserHostAddress.

В версиях .Net 4.0 и старше можно использовать и третий вариант, впрочем, являющийся всего лишь вариацией второго - использовать появившийся в этой версии .Net элемент конфигурации <serviceHostingEnvironment>. Для этого открываем web.config WCF-сервиса и добавляем в раздел <system.serviceModel> вот такую строку:

<servicehostingenvironment aspnetcompatibilityenabled="true">  

Все, теперь тоже можно пользоваться HttpContext.

1 комментарий: