Как настроить службу 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 для нескольких служб, которые инициализируются одинаково.