Служба WCF REST Совместное использование порта HTTP / HTTPS - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь настроить службу REST WCF так, чтобы она была доступна как по протоколу HTTP, так и по протоколу HTTPS.

Поскольку это сервис в рабочем состоянии, я бы хотел минимизировать изменения, необходимые для запуска HTTPS, иБег.Я хотел бы найти решение, в котором администратору нужно только заменить http:// на https://.. В соответствии с этим Wcf HTTP и HTTPS на одном хосте / порту , он долженбыло бы возможно достичь этого, но я борюсь с конфигурацией.

<services>
    <service name="My.Server">      
        <!-- HTTP services -->
        <endpoint address="/Common/"
                  behaviorConfiguration="restEndpointBehavior"
                  binding="webHttpBinding"
                  contract="My.IServer" />      
        <!-- HTTPS services -->
        <endpoint address="/Common/"
                  behaviorConfiguration="restEndpointBehavior"
                  binding="webHttpBinding"
                  bindingConfiguration="httpsBindingConfiguration"
                  contract="My.IServer" />
        <host>
            <baseAddresses>
                <add baseAddress="http://localhost:8732/MyService" />
                <add baseAddress="https://localhost:8732/MyService" />
            </baseAddresses>
        </host>
    </service>
</services>

Все работает нормально, пока я просто использую привязку HTTP или HTTPS (проверено с помощью Postman), но как толькоЯ активирую обе конечные точки, при которых запуск службы завершается неудачно:

Служба не может быть запущена.System.ServiceModel.AddressAlreadyInUseException: HTTP не может зарегистрировать URL-адрес https://+:8732/MyService/Common/. Другое приложение уже зарегистрировало этот URL-адрес с помощью HTTP.SYS.---> System.Net.HttpListenerException: не удалось прослушать префикс 'https://+:8732/MyService/Common/', поскольку он конфликтует с существующей регистрацией на компьютере.

Мне известны все netsh http urlacl | sslcert и может подтвердить, что это не должно быть проблемой, поскольку используется только одна конечная точка (HTTP или HTTPS) или изменен порт для HTTPS, например, : 8733 исправляет проблему, и служба отвечает, как и ожидалось, но, как было сказано ранее, я хотел бы использовать те же порты.

После исследования и попытки в течение довольно продолжительного времени, я предполагаю, что такая конфигурация не поддерживается.Кто-нибудь может подтвердить мои предположения или знает способ достижения желаемого результата?

1 Ответ

0 голосов
/ 22 января 2019

Вы знаете, что эти endpoints должны использовать разные bindingConfiguration, как вы это сделали, я настраиваю http и https для службы на порту 80, и они работают хорошо, но прежде чем я определил конфигурацию как ниже:

<webHttpBinding>
  <binding allowCookies="true" openTimeout="00:00:10" maxReceivedMessageSize="20000000">
    <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000" />
    <security mode="None" />
  </binding>
  <binding name="secureWebHttpBinding">
    <security mode="Transport">
      <transport clientCredentialType="None" />
    </security>
  </binding>
</webHttpBinding>

и затем определение endpoints как:

<service behaviorConfiguration="Commom2.Behavior" name="name"> 
  <endpoint address="rest" behaviorConfiguration="Rest.Behavior" binding="webHttpBinding"  contract="x">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <endpoint address="rest" behaviorConfiguration="Rest.Behavior" binding="webHttpBinding" bindingConfiguration="secureHttpBinding" contract="x">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <host>
    <baseAddresses>
      <add baseAddress="http://localhost/serviceName.svc" />
    </baseAddresses>
  </host>
</service>

Примечание:
Я включил привязку https и загрузил действительный сертификат туда, и я настроил один baseAddresses на http, как вы можете видеть в конфигурации, но эта служба доступна на http://localhost/serviceName.svc/rest и https://localhost/serviceName.svc/rest

Ваша проблема может быть из-за того, что два baseAddresses и неправильный порт зарегистрированы для https.

...