Несколько конечных точек HTTPS для службы WCF - PullRequest
0 голосов
/ 04 октября 2018

У меня есть служба WCF, которая работает с двумя конечными точками: HTTP и https.Мне нужно добавить другую конечную точку https, чтобы одному требовался сертификат клиента, а другому - нет.

Если я добавляю новую конечную точку https с собственным базовым адресом, я получаю сообщение об ошибке:

System.ArgumentException: эта коллекция уже содержит адрес со схемой https.В этой коллекции может быть не более одного адреса на схему.Если ваша служба размещается в IIS, вы можете устранить проблему, установив для 'system.serviceModel / serviceHostingEnvironment / multipleSiteBindingsEnabled' значение true или указав 'system.serviceModel / serviceHostingEnvironment / baseAddressPrefixFilters'.

Я попытался добавить

<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>

но это не помогло - возникла та же ошибка.

Если я добавлю новую конечную точку https, используя тот же Listen Uri, но с другой конфигурацией привязки, я получу ошибку:

System.InvalidOperationException: экземпляр привязки уже был связан для прослушивания URI 'https://localhost:9907/myservice/myservice'. Если две конечные точки хотят использовать один и тот же ListenUri, они также должны использовать один и тот же экземпляр объекта привязки.

Но мне нужны две разные привязки - одна с требованием сертификата клиента и одна без.

Возможно ли это?

Спасибо

1 Ответ

0 голосов
/ 05 октября 2018

Я понял это.Две конечные точки https должны использовать один и тот же ТИП привязки, а не одинаковые конфигурации привязки, а также иметь разные имена, например:

  <system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
</serviceHostingEnvironment>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding" />
    <binding name="HTTPSNoCert">
      <security mode="Transport" />
    </binding>
    <binding name="HTTPSWithCert">
      <security mode="Transport">
        <message clientCredentialType="Certificate" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service name="WcfServiceLibrary1.Service1">
    <endpoint address="b1" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding"
      name="BhttpEP" contract="WcfServiceLibrary1.IService1">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" />
    <endpoint address="bs1" binding="basicHttpBinding" bindingConfiguration="HTTPSNoCert"
      name="bHttpsEP1" contract="WcfServiceLibrary1.IService1" />
    <endpoint address="bs2" binding="basicHttpBinding" bindingConfiguration="HTTPSWithCert"
      name="bHttpsEP2" contract="WcfServiceLibrary1.IService1" />
    <host>
      <baseAddresses>
        <add baseAddress="http://myhostname:7654/b1" />
        <add baseAddress="https://myhostname:7655/b2" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

...