четверг, 31 марта 2011 г.

Способы размещения служб WCF. Часть 1: размещение службы в IIS


Финальной точкой при разработке любой WCF-службы является вопрос о том, как и где разместить эту службу. Под размещением понимается запуск службы в контексте какого-либо процесса операционной системы. Такой процесс называется владельцем этой службы. Он отвечает за время жизни службы и предоставляет контекст доступа к ее методам. 
При выборе способа размещения службы нужно руководствоваться следующими важными факторами:
  • возможность быстрого включения/остановки службы
  • удобство администрирования
  • использование различных протоколов взаимодействия: tcp, http и т.д.
Существуют следующие способы размещения WCF-служб:
  • Размещение службы в среде IIS
  • Размещение в контексте любого Windows-приложения (сервис операционной системы, консольное приложение, WinForm-приложение и т.д.).
  • Размещение в среде Windows Process Activations Services (WAS)
Размещение службы WCF в IIS
Начнем с самого простого и быстрого способа размещения службы -  размещения в среде IIS. В IIS версии 6 для управления процессами корпорацией Microsoft были реализованы пулы приложений, за счет которых происходила четкая изоляция одного запущенного приложения от другого. Это значительно увеличило надежность работы приложений их доступность и безопасность, а так же дало возможность гибкой настройки их конфигурации.
Но, несмотря на все эти улучшения, размещение WCF-службы в IIS 6 дает одно очень значимое ограничение: IIS 6 может работать только по протоколу HTTP, следовательно, если ваша служба реализована через привязку (binding), не использующую протокол HTTP, например, привязка NetTcpBinding, то размещение службы на IIS будет невозможно.
Корпорация Microsoft учла эту ситуацию в релизах IIS 7.0 и IIS 7.5. Нет, разработчики, конечно же, не изменили в IIS стек протоколов. На самом деле было просто обобщено управление процессами и разделено согласно протоколам между IIS и новой службой Windows Process Activations Services (WAS), о которой речь пойдет в следующей части.
Плюсы размещения службы в IIS:
  • Интеграция IIS с инфраструктурой сервера, что обеспечивает высокую производительность
  • Удобство управления службой через графическую оболочку IIS
  • Встроенная безопасность в IIS.
Минусы размещения службы в IIS:
  • Служба должна использовать только привязку на основе протокола HTTP (BasicHttpBinding или WSHttpBinding)
  • Невозможность предоставления специального административного интерфейса управления службой отличного от интерфейса IIS
Таким образом, если поставлена цель разместить службу WCF в среде IIS, то в качестве одной из доступных привязок нужно использовать BasicHttpBinding илиWSHttpBinding.
Для примера я буду размещать службу, созданную по стандартному шаблону в Visual Studio 2010 (меню New->Project->WCF Service Application). Чтобы разместить службу WCF в IIS нужно сделать следующее:
1. Создать виртуальный каталог (здесь и далее я буду использовать IIS 7.5)
Я назвал сайт wcfhost. В IIS 7.5 для каждого нового сайта автоматически создается отдельный пул приложения. В поле Physical path нужно указать путь к каталогу, где располагается служба WCF. В разделе Binding я указываю, что к сайту можно будет обратиться по адресу типа http://ServerName:8096, где ServerName - имя сервера, где установлен IIS.
2. Подготовить файл с расширением *.svc, в котором определяется месторасположение службы. При использовании стандартного шаблона создания службы WCF в Visual Studio 2010 этот файл будет создан автоматически. В моем проекте он называется Service1.svc. Данный файл содержит все лишь одну строку:
<%@ServiceHost Language="C#" Debug="true" Service="WcfService1.Sevice1" CodeBehind="Service1.svc.cs"%>
Видно, что в файле указано пространство имен и имя класса сервиса, а так же имя файла кода.
3.  Внести необходимые настройки в web.config, а именно - определить оконечную точку (точки) (endpoints). Нужно не забывать, что  стек каналов в привязке должен использовать HTTP в качестве транспортного протокола. В WCF уже встроены две таких привязки: basicHttpBinding и wsHttpBinding. Определим привязку в разделеsystem.serviceModel:


   
     
       
     
   
   
   
 

Здесь мы определили, что наша служба будет размещена по адресу http://host:8096 и иметь две оконечные точки: точка с привязкой basicHttpBinding (заметьте, что адрес у точке пустой, следовательно, сервис будет использовать для этой точки адрес, указанный в теге baseAddress) и точка с привязкой mexHttpBinding (эта точка служит для получения метаданных по сервису, а именно описание его интерфейса и методов)  
Вот и все, что нужно для размещения на сервере IIS. Теперь откомпилируем наш проект в Visual Studio  и скопируем его содержимое в виртуальный каталог IIS. 
Далее обратимся к нашему сервису по следующему адресу http://host:8096/service1.svc. В результате получим стандартное окно WCF-службы.
Все, служба доступна. Теперь любой клиент, может обращаться к указанному адресу http://host:8096/service1.svc и вызывать методы сервиса.
Замечание: хочу упомянуть один момент: если вы, компилируя сервис в VisualStudio, указали target platform - x86, то у вас может возникнуть ошибка при обращении к сервису, связанная с тем, что IIS на сервере работает в режиме x64. Для решения достаточно просто выбрать target platform - x64 или Any CPU, скомпилировать приложение и скопировать его на IIS.

2 комментария:

  1. Наверно не соглашусь с пунктом "Служба должна использовать только привязку на основе протокола HTTP". В IIS 7.5 уже появилась возможность использовать любые привязки.

    В настройках сайта -> Изменить привязки
    В настройках приложения -> Дополнительные параметры ->Активные протоколы

    ОтветитьУдалить