Настройка web.config службы WCF для изменения сгенерированного wdl

Моя служба wcf следует следующей структуре балансировки нагрузки:

общедоступный (https) -> F5 LB (http) -> node1 / node2.

Я выставляю услуги по схеме http, а F5 LB заботится о разгрузке ssl. поскольку моя служба отображается как http, сгенерированный wsdl через F5 LB содержит URL-адрес на основе http, как показано ниже:

URL моей службы LB:

https://myservice.mydomain.com/service1.svc

и сгенерированная служебная страница:

MyService Service

You have created a service.

To test this service, you will need to create a client and use it to call the service. You can do this using the svcutil.exe tool from the command line with the following syntax:    

svcutil.exe http://myservice.mydomain.com/service1.svc?wsdl

You can also access the service description as a single file:

http://myservice.mydomain.com/service1.svc?singleWsdl

как вы заметили, сгенерированная страница имеет URL-адрес http, открытый из узлов приложения. поскольку F5 LB предоставляет службу как https, он не разрешает указанный выше URL-адрес http, и запрос от клиента отскакивает.

теперь, можем ли мы настроить мою службу web.config, чтобы открыть службу по схеме http, но чтобы wsdl указывал на URL-адрес https, чтобы URL-адрес из сгенерированного выше wsdl из F5 LB тоже https и клиент работал по https а запрос от LB придет в службу по http, что моя служба обрабатывает?


person Alagesan Palani    schedule 13.11.2014    source источник
comment
Эта ссылка имеет более подходящий ответ: stackoverflow.com/questions/634522/   -  person Alagesan Palani    schedule 27.11.2014


Ответы (2)


Не понимая полностью вашу конфигурацию / среду, я предложу несколько вариантов, которые могут помочь вам решить проблему:

  • Укажите базовые адреса http и https в конфигурации вашей службы и включите метаданные только через https ''
  • Внедрить отдельную конечную точку mex (вместо использования serviceMetadata), что позволяет лучше контролировать конечную точку метаданных (т. Е. Разные address и / или listenUri)
  • Используйте System.ServiceModel.Description.IWsdlExportExtension для управления метаданными предоставленных услуг

Ссылки:
В чем разница между WSDL и Конечная точка Mex в WCF
http://blogs.msdn.com/b/saurabs/archive/2012/04/27/http-get-vs-mex-end-point.aspx
http://msdn.microsoft.com/en-us/library/aa717040.aspx

person Seymour    schedule 13.11.2014

Я никогда этого не делал, но, как и большинство вещей в WCF, есть точки расширения, которые можно использовать, чтобы переопределить его поведение по умолчанию.

Похоже, что вам нужно реализовать настраиваемую конечную точку «метаданных». В MSDN есть серия статей по Экспорт настраиваемых метаданных < / а>. В частности, существует IWsdlExportExtension вы можете реализовать, чтобы получить доступ к данным WSDL перед их отправкой клиенту.

Похоже, это работает так же, как и большинство других расширений поведения, а это значит, что вы бы сделали что-то подобное (опять же, я никогда этого не делал, но это должно помочь вам начать; также см. в этой записи блога для получения дополнительных сведений о механизме расширения поведения. ):

  • Реализуйте расширение, реализующее IWsdlExportExtension и IEndpointBehavior.
  • Реализуйте элемент расширения поведения, который может войти в файл конфигурации
  • Зарегистрируйте это расширение поведения конечной точки, добавив его в элемент system.serviceModel / extensions / behaviorExtensions в вашем файле конфигурации.
  • Добавьте новое расширение в поведение конечной точки.

e.g.:

public class LbWsdl : IWsdlExportExtension, IEndpointBehavior
{
    public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)
    {
        // Fix WSDL here
    }
}

public class LbWsdlExtension : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get { return typeof(LbWsdl); }
    }
}

<system.serviceModel>
  <extensions>
    <behaviorExtensions>
      <add name="lbWsdl" type="LbWsdlExtensions.LbWsdlExtension,LbWsdlExtension />
    </behaviorExtensions>
  </extensions>
  <behaviors>
    <endpointBehaviors>
      <behavior name="LoadBalancedBehavior">
        <webHttp/>
        <lbWsdl />
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>
person Michael Edenfield    schedule 13.11.2014