Добавьте в свой класс обслуживания следующий атрибут:
<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>
Это позволяет клиенту обращаться к службе как https://...
, но служба по-прежнему может размещаться на http://.....
См. Мой ответ на Как указать AddressFilterMode.Any декларативно, чтобы узнать, как создать расширение, позволяющее указывать AddressFilterMode.Any
в конфигурации без необходимости атрибуты кода.
В web.config
узла службы элемент конечной точки должен иметь абсолютный URL в атрибуте адреса, который является общедоступным URL-адресом, который будет использоваться клиентом. В том же элементе конечной точки установите для атрибута listenUri
абсолютный URL-адрес, который прослушивает узел службы.
Способ определения абсолютного URI по умолчанию, который прослушивает хост, заключается в добавлении ссылки на службу в клиентском приложении, которая указывает на физический сервер, на котором размещена служба. В web.config клиента будет указан адрес службы. Затем я копирую это в атрибут listenUri в файле hosts web.config.
В конфигурации поведения службы добавьте элемент serviceMetaData
с атрибутом httpGetEnabled=true
У вас будет что-то вроде этого:
<serviceBehaviors>
<behavior name="myBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
<!-- ... -->
<services>
<service name="NamespaceQualifiedServiceClass" behavior="myBehavior" >
<endpoint listenUri="http://www.servicehost.com"
address="https://www.sslloadbalancer.com"
binding="someBinding"
contract="IMyServiceInterface" ... />
</service>
</services>
Я не уверен, работает ли это с безопасностью сообщений или безопасностью транспорта. Для этого конкретного приложения учетные данные были переданы как часть DataContract, поэтому у нас было basicHttpBinding
›security
› mode=none
. Поскольку транспорт безопасен (для балансировщика нагрузки ssl), проблем с безопасностью не было.
Также можно оставить атрибут listenUri пустым, но он должен присутствовать.
К сожалению, в WCF есть ошибка, при которой базовый адрес импортированных схем в WSDL имеет базовый адрес listenUri, а не общедоступный базовый адрес (тот, который настроен с использованием атрибута адреса конечной точки). Чтобы обойти эту проблему, вам необходимо создать реализацию IWsdlExportExtension, которая напрямую переносит импортированные схемы в документ WSDL и удаляет импорт.
Пример этого приведен в этой статье на Встроенный XSD в WSDL с WCF. Кроме того, вы можете унаследовать класс от BehaviorExtensionElement
и дополнить два новых метода:
Public Overrides ReadOnly Property BehaviorType() As System.Type
Get
Return GetType(InlineXsdInWsdlBehavior)
End Get
End Property
Protected Overrides Function CreateBehavior() As Object
Return New InlineXsdInWsdlBehavior()
End Function
Это позволит вам добавить поведение расширения в файл .config и добавить поведение, используя конфигурацию, вместо того, чтобы создавать фабрику служб.
Под элементом конфигурации system.servicemodel
добавьте:
<behaviors>
<endpointBehaviors>
<behavior name="SSLLoadBalancerBehavior">
<flattenXsdImports/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1-->
<add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
А затем укажите новое поведение конечной точки в своей конфигурации конечной точки с помощью атрибута behaviorConfiguration.
<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">
person
Richard Collette
schedule
03.06.2009