WCF привязка к HTTPS

Я понимаю, что есть много сообщений об этом, и я прошел через все из них, которые пришли на мой поиск и реализовали все, что было упомянуто. У меня есть веб-сервис WCF, который работает на моей локальной системе по протоколу HTTP, и он работал на сервере по протоколу HTTP. Но клиент требует, чтобы это работало через HTTPS. Мириад сообщений на этом и других сайтах показывает мне, что это не так прямо, как должно быть, поскольку до этого веб-сервис ASMX "просто работал" и не нуждался в сложной конфигурации.

Я получаю следующую ошибку с моей текущей конфигурацией:

Не удалось найти базовый адрес, соответствующий схеме https для конечная точка с привязкой WSHttpBinding. Схемы зарегистрированных базовых адресов [http].

Вот мой код с этого момента, после нескольких дней работы, чтобы настроить это, чтобы работать безрезультатно:

<system.serviceModel>

    <!--     -->
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="true" >
        <baseAddressPrefixFilters>
            <add prefix="https://mysite.com"/>
            <add prefix="http://mysite.com"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>

    <!-- Set up Custom Behaviors -->    
    <behaviors>

        <endpointBehaviors>
        </endpointBehaviors>

        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>

    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>

        <wsHttpBinding>
            <binding    name="SOAPBinding" 
            >

                <security mode="Transport">
                </security>
            </binding>
        </wsHttpBinding>

    </bindings>

    <services>

        <service    
                    behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                    name="WebPostService.WebPostService"
        >

    <host>
      <baseAddresses>
        <add baseAddress="https://mysite.com/Services/WebPostService.svc"/>
      </baseAddresses>
    </host>
            <endpoint   address="" 
                        binding="wsHttpBinding" 
                        bindingConfiguration="SOAPBinding"
                        contract="WebPostService.IWebPostService"
            >
                <identity>
                    <dns value="mysite.com" />
                </identity>
            </endpoint>

            <endpoint   
                        address="mex" 
                        binding="mexHttpsBinding" 
                        contract="IMetadataExchange" 
            >
            </endpoint>

        </service>

    </services>

</system.serviceModel>

Что я делаю неправильно, и как я могу заставить это работать над HTTPS? Я расстроен тем, что это не так просто, как должно быть. Я был замешан в документации WCF в MSDN за месяцы работы над этим проектом и хорошо разбираюсь в сервисах, конечных точках и привязках - достаточно, чтобы расстроить меня даже больше, чем если бы я вообще не знал.

UPDATE: все еще работая над этим, у меня была странная ошибка при попытке поместить полный URL-адрес для mex-адреса. Я изменил это:

address="https://prcwebs.com/Services/WebPostService.svc/mex" 

и получил ошибку:

Параметры безопасности для этой службы требуют проверки подлинности Windows, но он не включен для приложения IIS, на котором размещена эта служба.

Я не пытаюсь использовать проверку подлинности Windows, параметр безопасности не был изменен и по-прежнему установлен на

< режим безопасности = "Транспорт" / >

Не удалось найти базовый адрес, соответствующий схеме https для конечной точки со связыванием WebHttpBinding. Зарегистрированные базовые адресные схемы: [http]  - не помогло, ничто не упоминалось, что поможет Не удалось найти базовый адрес, соответствующий схеме http для конечной точки со связыванием WSHttpBinding  - Я использую транспортную безопасность, это не применимо. попытался перейти на разные режимы безопасности, все равно не смог заставить сайт работать.

Ответ 1

Добавьте multipleSiteBindingsEnabled="true" в serviceHostingEnvironment и обновите защиту, чтобы отключить учетные данные клиента:

<security mode="Transport">
    <transport clientCredentialType="None"></transport>
</security>

ИЗМЕНИТЬ Моя последняя рабочая версия под Windows 2003 была со следующей конфигурацией.

<system.serviceModel>
    <serviceHostingEnvironment  aspNetCompatibilityEnabled="false" />

    <!-- Set up Custom Behaviors -->    
    <behaviors>
        <endpointBehaviors>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="WebPostService.WebPostServiceBehavior">
                <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"  /> 
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <!-- Set up the binding configuration  -->
    <bindings>
        <wsHttpBinding>
            <binding name="SOAPBinding">
                <security mode="Transport">
                  <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

    <services>
        <service behaviorConfiguration="WebPostService.WebPostServiceBehavior"
                 name="WcfService2.Service1">

            <host>
                <baseAddresses>
                    <add baseAddress="https://localhost/Service/Service1.svc"/>
                </baseAddresses>
            </host>
            <endpoint address="" 
                      binding="wsHttpBinding" 
                      bindingConfiguration="SOAPBinding"
                      contract="WcfService2.IService1">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>

            <endpoint address="mex" 
                      binding="mexHttpsBinding" 
                      contract="IMetadataExchange">
            </endpoint>
        </service>
    </services>
</system.serviceModel>

Вы можете получить доступ к веб-сайту с помощью https, поэтому я думаю, что часть сертификата установки верна. Если у вас есть что-то, что вы хотите сравнить с моей настройкой, дайте мне знать.

Ответ 2

Вы используете неправильные привязки для HTTPS.

Существует два отдельных класса привязки. wsHttpBinding и wsHttpsBinding отмечают s. Вам нужно добавить привязку wsHttpsBinding для HTTPS при привязке, и для этой привязки вам понадобится новая конечная точка.

Также особая ошибка, которую вы видите, я вижу, что IIS не был настроен для https из этого местоположения.

  • Откройте диспетчер IIS
  • Открытые сайты
  • Щелкните правой кнопкой мыши веб-сайт по умолчанию.
  • Изменить привязки
  • Убедитесь, что есть запись для https, а также http.

  • Откройте диспетчер IIS
  • Найдите свое приложение (я думаю, что он будет веб-сайтом по умолчанию).
  • Щелкните правой кнопкой мыши
  • Управление веб-сайтом/приложением
  • Дополнительные параметры
  • Включенные протоколы
  • HTTP, HTTPS

Ответ 3

Я использовал это, и это сработало для меня, возможно, это может помочь вам

Чтобы включить привязку Https к WCF WsHttp, в файле web.config есть несколько простых шагов.

Эти шаги:

Включить безопасность уровня транспортного уровня в файле web.config службы:

На этом шаге вам необходимо изменить режим безопасности с одного на транспортный. Код ниже показывает, как вы можете это сделать:

<bindings>
    <wsHttpBinding>
        <binding name="TransportSecurity">
            <security mode="Transport">
                <transport clientCredentialType="None"/>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

Свяжите привязку и укажите конфигурацию HTTPS

Теперь вам нужно связать привязки, шаг предварительного просмотра, с конечными точками. используйте тег bindingConfiguration, чтобы указать имя привязки. Вам также необходимо указать адрес, в котором размещена служба. Код ниже показывает, как вы можете это сделать

<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
    <endpoint address=https://localhost/WCFWSHttps/Service1.svc binding="wsHttpBinding"  bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>

. вам также необходимо изменить httpGetEnabled на httpsGetEnabled в serviceMetaData. Код ниже показывает, как вы можете:

<serviceMetadata httpsGetEnabled="true"/> 

Надеюсь, что это помогло

Ответ 4

Я использовал вашу точную конфигурацию в настройке 3.5 и работает с Transport с помощью clientCredentialType="None", как указано ниже в ответе Луук. Но, чтобы быть уверенным, я отправился в созданный образец проекта, чтобы имитировать большую часть вашей среды, как я мог бы извлечь из информации здесь.

Чтобы имитировать вашу среду, я установил свой IIS (7.5) для использования стандартного пула приложений Asp.Net 2.0 Integrated. Я добавил 3 привязки http и 3 привязки https, чтобы имитировать ваш "может иметь только один адрес для каждой проблемы схемы" и baseAddressPrefixFilters работает с этим.

Я только выполнил поиск и заменил на mysite.com на localhost. Ниже приведена скопированная копия точной конфигурации, которую я использовал для создания скриншота:

web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" />
    <authentication mode="None"/>
    <customErrors mode="Off"/>
  </system.web>
  <system.serviceModel>
    <!--     -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <baseAddressPrefixFilters>
        <add prefix="https://localhost"/>
        <add prefix="http://localhost"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <!-- Set up Custom Behaviors -->
    <behaviors>
      <endpointBehaviors/>
      <serviceBehaviors>
        <behavior name="WebPostService.WebPostServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpsGetUrl="WebPostServices.svc/mex"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- Set up the binding configuration  -->
    <bindings>
      <wsHttpBinding>
        <binding name="SOAPBinding">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WebPostService.WebPostServiceBehavior" name="WebPostService.WebPostService">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost/Services/WebPostService.svc"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="SOAPBinding" contract="WebPostService.IWebPostService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

Здесь результат:

Screenshot

Вы заметите, что WebPostService.svc дважды появляется в mex полном URL-адресе. Вам нужно отбросить httpsGetUrl только mex вместо WebPostService.svc/mex (или вообще отказаться от него, и он по-прежнему отлично работает на моей стороне)

Если вы хотите обсудить это или что может отличаться от наших envinronments, кроме версии IIS, я в чате WPF почти весь день (еще 5-6 часов).