Если вам нужно узнать с какого адреса приходит обращение к вашему 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.
здравствуйте. А если без сервера IIS?
ОтветитьУдалить