Служба IIS WCF и служба Windows
Мы разработали сервис WCF и хотим его развернуть. Наши клиенты будут использовать его с basicHttpBinding
но наша внутренняя команда будет использовать его с namedPipesBinding
,
Мы задаемся вопросом, лучше ли разместить его в IIS 7 или с помощью службы Windows. Мы провели несколько тестов и выяснили, что когда мы добавляем привязки в IIS, он не обновляет конфигурационный файл нашего сервиса. Это означает, что нам нужно поддерживать конфигурацию в двух разных местах. Это не логично, верно?
Мы также прочли в Stackru, что базовый адрес игнорируется, когда служба WCF является хостом в IIS (см. Вопрос о файле конфигурации службы WCF относительно
7 ответов
Чтобы ответить на эти вопросы:
Мы провели несколько тестов и выяснили, что когда мы добавляем привязки в IIS, он не обновляет конфигурационный файл нашего сервиса. Это означает, что нам нужно поддерживать конфигурацию в двух разных местах. Это не логика, верно?
Когда вы используете IIS для размещения своей службы, вы должны сконфигурировать свой файл App.config или файл web.config, чтобы IIS предоставил некоторую привязку, поэтому в файле конфигурации вы поместите всю свою привязку, которую вы разрешаете, в службу wcf. Http, net.tcp и т.д...
В вашей привязке вы не будете указывать адрес, потому что вы будете указывать эти адреса в IIS напрямую.
В IIS вы должны разрешить привязку, доступную в расширенных настройках вашего веб-сайта. После этого вы установите новую привязку для вашего веб-сайта "веб-сервис" и добавите все привязки, которые вы хотите прослушать, и укажите адрес.
Вы будете указывать адрес непосредственно в IIS.
Есть пример.
Ваш файл конфигурации:
<services>
<service name="ServiceName">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="httpMode"
contract="IContract" />
<endpoint address=""
binding="netTcpBinding"
contract="IContract" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
В вашей IIS Advenced настройки вы будете ставить
http, net.tcp во включенных протоколах
После этого вы перейдете в привязку к IIS. Поместите вашу привязку для http normaly и добавьте новую привязку net.tcp, в конфигурации привязки укажите порт и виртуальный каталог, например
8001:*
Этот параметр разрешает все подключения к порту 8001 для любого виртуального каталога.
Вы также должны иметь на своем сервере функцию "Активация WCF, (Активация Http и Активация без Http)".
Хостинг в IIS имеет много плюсов и минусов.
Да, IIS обеспечивает загрузку по требованию - это может быть плюсом или минусом. Когда приходит запрос, создается ServiceHost, затем создается экземпляр класса обслуживания, и запрос обрабатывается. Ничто не должно бегать круглосуточно. Но в то же время эта настройка требует больше времени и усилий каждый раз, когда приходит сообщение, и вы, как программист, на самом деле не имеете большого контроля над хостом службы.
И да, в IIS виртуальный каталог, в котором находится файл *.svc, определяет ваш адрес - любые базовые адреса или явно определенные адреса в вашей конфигурации игнорируются. И без особых усилий вы не сможете изменить расположение адресов служб - они всегда будут http://servername/virtualdirectory/YourService.svc (включая расширение.svc).
Самостоятельный хостинг часто в разы быстрее, так как ваш ServiceHost уже запущен и работает - но вам нужно убедиться, что он действительно работает, нет загрузки по требованию при поступлении сообщения - либо оно работает, либо может обслуживать запрос или нет. Но у вас гораздо больше контроля над хостом службы - когда и как он построен и т. Д., И вы можете выбирать и определять адреса своих служб по своему усмотрению.
Лично я почти всегда предпочел бы использовать собственный хостинг - в консольном приложении для тестирования, в сервисе NT для производства. Для меня это просто кажется более подходящим и более контролируемым способом. Вы должны сделать больше работы - но вы точно знаете, что делаете.
Марк
marc_s обычно дает отличные ответы, с которыми я полностью согласен, но в этом случае нет.
Самостоятельное размещение WCF не очень хорошая идея, особенно в связи с тем, что Microsoft вскоре выпустит технологии Dublin. Управление и работа приложений WCF (и WF) намного проще, если они размещены внутри IIS.
Кроме того, вы получаете загрузку по требованию.
Для IIS7.5 (WS2008 R2) всегда включена опция.
И вы можете легко переписать URL, чтобы пропустить.svc, если это вас беспокоит.
Интересный тидбит-> после прочтения этой темы я наткнулся на эти слова в MSDN о размещении службы WCF с помощью службы Windows:
Ниже приведены некоторые недостатки служб Windows:
• Развертывание: службы должны быть установлены с помощью утилиты.NET Framework Installutil.exe или с помощью настраиваемого действия в пакете установщика.
• Ограниченные возможности. Службы Windows по-прежнему имеют ограниченный набор готовых функций для поддержки сценариев высокой доступности, простоты управления, управления версиями и развертывания. По сути, вы должны сами покрыть эти требования с помощью пользовательского кода, в то время как, например, IIS поставляется с некоторыми из этих функций по умолчанию. Службы Windows добавляют возможность восстановления и некоторые функции безопасности, но вам все равно придется поработать самостоятельно.
http://msdn.microsoft.com/en-us/library/bb332338.aspx
... и следующая ссылка:
Услуги хостинга: (хорошая сравнительная таблица)
http://msdn.microsoft.com/en-us/library/ms730158.aspx
На этот вопрос нет стандартного ответа. Я полностью не согласен с ответом от Cheeso (Самостоятельный хостинг WCF не очень хорошая идея).
Пожалуйста, проверьте следующие ссылки: ( http://msdn.microsoft.com/en-us/library/ms730158.aspx, http://msdn.microsoft.com/en-us/library/bb332338.aspx) и подумайте о своем ограничивает:
- операционная система
- ожидаемая производительность
- доступный HW
- ожидаемая доступность
и вы увидите, что во многих ситуациях "собственный хостинг" является лучшей альтернативой.
IIS предоставляет вам множество готовых функций, таких как перезагрузка домена приложения, мониторинг и так далее.
Вот почему вы должны ответить на эти вопросы в первую очередь: вам нужны все эти функции или нет? Если нет - Windows Service может быть рассмотрен.
Хотя здесь есть выбранный ответ, я позволю себе опубликовать ссылку на тему вопросов и ответов.
Как настроить службу WCF из кода при размещении в IIS?
То, что вы найдете в моем ответе там (и ссылку в нем), является вашим хорошим контролем над хостом службы, загружаете ли вы его в WService или в IIS.
После запуска службы вы можете узнать, какие привязки есть у IIS, и создать соответствующие конечные точки. Ищите конфигурацию II через пространство имен Microsoft.Web.Administration.
Надеюсь это немного поможет.