Как настроить службу WCF из кода при размещении в IIS?

Моя служба WCF предоставляет доступ к конечной точке https И http. Помимо SSL они идентичны. Они отображаются на тот же код.

Конечное намерение заключается в том, чтобы внешние пользователи могли подключаться через https, а внутренние пользователи - через http.

В разработке это дает мне проблему. Cassini, веб-сервер разработки, упакованный в VS, ненавидит SSL.

Мне интересно, могу ли я настроить службу из кода, поэтому при работе под Cassini я не настроил бы https.

Отсюда вопрос - как настроить службу из кода, если она размещена на IIS? Я был бы очень рад альтернативным ответам о том, как я могу убедить Кассини НЕ жаловаться на https часть конфигурации.

2 ответа

Решение

Когда вы размещаете хостинг в IIS, вы уделяете много внимания вопросам, связанным с IIS, - в этом случае вы не сможете воспользоваться услугами.

IIS позаботится о том, чтобы ускорить ServiceHost на основе вашего *.svc файла - не так уж много вы можете с этим поделать, правда.

Мое решение будет другим - вывести <service> тег в вашем файле конфигурации (web.config):

<system.serviceModel>
  <services>      
     <service configSource="service.dev.config" />
  </services>
</system.serviceModel>

В вашей среде разработки предоставьте только конечную точку http - так что ваши service.dev.config будет выглядеть примерно так:

<service name=".....">
    <endpoint name="default"
              address="....."
              binding="basicHttpBinding" bindingConfiguration="insecure"
              contract="......" />
</service>

Создать второй service.prod.config который затем содержит обе конечные точки - http и https:

<service name=".....">
    <endpoint name="default"
              address="....."
              binding="basicHttpBinding" bindingConfiguration="insecure"
              contract="......" />
    <endpoint name="secure"
              address="....."
              binding="basicHttpBinding" bindingConfiguration="secure"
              contract="......" />
</service>

и ссылку на это в вашем web.config на сервере развертывания.

"IIS позаботится о том, чтобы ускорить создание необходимого ServiceHost на основе вашего *.svc-файла - не так уж много вы можете с этим поделать".

Не слишком близко к истине. Именно в SVC-файле вашего сервиса есть атрибут Factory. Где вы можете указать класс и сборку, где класс находится. Этот класс может быть вашим собственным потомком Web|DataServiceHostFactory, поэтому ваша разметка svc будет выглядеть так

<%@ ServiceHost 
Language="C#"
 Debug="true" 
 Service="name.space.myService" 
 CodeBehind="name.space.myService.svc.sc" 
 Factory = "name.space.WebServiceHostFactoryEx, assembly.name"
 %>

WebServiceHostFactory будет создаваться для каждого обращения к службе и воссоздает ваш хост так, как вы этого хотите.

Вы также должны будете унаследовать WebServiceHost и создать его так, как вам нужно, с определенными конечными точками, поведением, адресами и т. Д. Настройками - что угодно.

Здесь очень хороший пост от Микеле Бустаманте

Я использую это в среде IIS для нескольких служб, которые инициализируются одинаково.

Другие вопросы по тегам